Реактивные / Рассчитать столбцы в rhandsontable в блестящей студии
Я пытаюсь добавить пользовательскую проверку в следующую интерактивную таблицу. Я пытаюсь сделать следующее. Таблица содержит три переменные, а именно mpg, cyl и disp. Предположим, я редактирую значение mpg первой строки. Затем, как только я нажму кнопку ввода, значение disp 1-го ряда должно быть автоматически изменено, рассчитанное как disp = mpg/cyl. Здесь значение mpg является новым значением, которое я редактировал. Аналогично, если я снова отредактирую цил в определенной строке, disp этой конкретной строки должен быть автоматически изменен как disp = mpg/cyl. Более того, если я изменю значение disp конкретной строки, цил этой конкретной строки должен быть изменен автоматически, рассчитывается как mpg/cyl. Я пытаюсь понять, как это сделать.
library(shiny)
library(datasets)
ui=fluidPage(
rHandsontableOutput("table1")
)
server=function(input, output, session) {
mt=reactive({
datacopy= mtcars[, names(mtcars) %in% c("mpg" , "cyl" , "disp")]
datacopy=data.table(datacopy)
})
output$table1=renderRHandsontable({
rhandsontable(mt())
})
}
shinyApp(ui,server)
1 ответ
Я думаю, что это достигнет того, что вы хотите:
library(shiny)
library(datasets)
library(rhandsontable)
library(data.table)
ui=fluidPage(
rHandsontableOutput("table1")
)
server=function(input, output, session) {
mt=reactive({
datacopy <- NULL
#For initial data upload
if(is.null(input$table1)){
datacopy= mtcars[, names(mtcars) %in% c("mpg" , "cyl" , "disp")]
datacopy=data.table(datacopy)
}else{
datacopy = hot_to_r(input$table1)
#If there is change in data
if(!is.null(input$table1$changes$changes)){
row.no <- unlist(input$table1$changes$changes)[1]
col.no <- unlist(input$table1$changes$changes)[2]
new.val <- unlist(input$table1$changes$changes)[4]
#If the changed value is mpg or cyl
if(col.no == 0 || col.no == 1){
datacopy[(row.no+1), 3] = datacopy[(row.no+1), 1]/datacopy[(row.no+1), 2]
}else{
datacopy[(row.no+1), 2] = datacopy[(row.no+1), 1]/datacopy[(row.no+1), 3]
}
}
}
datacopy
})
output$table1=renderRHandsontable({
rhandsontable(mt())
})
}
shinyApp(ui,server)
Надеюсь, поможет!
[РЕДАКТИРОВАТЬ]: Согласно вашему отредактированному ответу, я изменил код ниже. Надеюсь, это поможет.
library(shiny)
library(datasets)
library(rhandsontable)
library(data.table)
c1= c(rep("0112",3), rep("0113",3),rep("0114",3))
c2= c( rep(c("A", "B","C"),3))
c3= c(rep(c("5312", "5421", "5510"),3))
c4=c(rep(c("Area", "Yield", "Prod"),3))
c5 = c( rep(2010,9))
c6= c( 4,68,16169,1062,1.5,43225,800,1.25,100)
data_=cbind(c1,c2,c3,c4,c5,c6)
data_=as.data.frame(data_)
names(data_) = c("CPCCode", "Item","ElementCode","El","Year","Value")
data_$Value=as.numeric(levels( data_$Value))[ data_$Value]
data_$Year= as.integer(levels( data_$Year))[data_$Year]
data_$ElementCode = as.character(data_$ElementCode)
rownames(data_) = NULL
ui=fluidPage(
rHandsontableOutput("table1")
)
server=function(input, output, session) {
mt=reactive({
datacopy <- NULL
#For initial data upload
if(is.null(input$table1)){
datacopy <- data_
}else{
datacopy = hot_to_r(input$table1)
#If there is change in data
if(!is.null(input$table1$changes$changes)){
row.no <- unlist(input$table1$changes$changes)[1]
element = datacopy[(row.no + 1), "ElementCode"]
year= datacopy[(row.no + 1), "Year"]
cpccode= datacopy[(row.no + 1), "CPCCode"]
col.no <- unlist(input$table1$changes$changes)[2]
if(element == "5421"){#Yield
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5510"] =
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5312"] *
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5421"]
}else if(element == "5510"){#Area
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5312"] =
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5510"] /
datacopy$Value[datacopy$CPCCode == cpccode & datacopy$Year == year &
datacopy$ElementCode == "5421"]
}
}
}
datacopy
})
output$table1=renderRHandsontable({
rhandsontable(mt())
})
}
shinyApp(ui,server)