问题描述
问题:在下面的“闪亮”应用中,我想更改并通过rhandsontable将新行插入到以下数据中:
data.frame(car = c("Opel","Nissan","Opel","VW"),location = c("Ruesselsheim","Frankreich","Ruesselsheim","Wolfsburg"))
- 例如,如果我将
car == Opel
更改为car == VW
,则位置将从吕塞尔斯海姆更改为沃尔夫斯堡。 - 如果我插入新行,例如用
car == Opel
填充它,那么在输入汽车信息后,位置应直接位于吕塞尔斯海姆
问题:如何有条件地更改单元格值并定义条件默认值?
尝试::hot_col
具有默认参数,但仅接受字符串,而不接受条件。通过观察者跟踪变化似乎并不是最好的方法。
有关如何解决此问题的任何想法?非常感谢!
library(shiny)
library(rhandsontable)
ui = shinyUI(fluidPage(
titlePanel("Handsontable"),sidebarLayout(
sidebarPanel(
rHandsontableOutput("hot")
),mainPanel(
verbatimtextoutput("debug")
)
)
))
server = function(input,output) {
data <- reactive({
data.frame(car = c("Opel","Wolfsburg"))
})
output$hot <- renderRHandsontable({
DF <- data()
rhandsontable(DF,useTypes = FALSE,selectCallback = TRUE)
})
### DEBUG
output$debug <- renderPrint({
req(input$hot)
input$hot$changes
})
}
shinyApp(ui = ui,server = server)
解决方法
可以通过使用reactiveVal
和查找表将当前选择与以下内容合并来实现所需的行为:
library(shiny)
library(rhandsontable)
ui = shinyUI(fluidPage(
titlePanel("Handsontable"),sidebarLayout(
sidebarPanel(
rHandsontableOutput("hot")
),mainPanel(
verbatimTextOutput("debug")
)
)
))
server = function(input,output) {
LUT_DF <- data.frame(car = c("Opel","Nissan","VW"),location = c("Ruesselsheim","Frankreich","Wolfsburg"))
data <- reactiveVal(data.frame(car = c("Opel","Opel","Ruesselsheim","Wolfsburg")))
output$hot <- renderRHandsontable({
rhandsontable(data(),useTypes = FALSE,selectCallback = TRUE)
})
observeEvent(input$hot,{
data(merge(LUT_DF,hot_to_r(input$hot)[1],by = "car"))
},ignoreInit = TRUE)
}
shinyApp(ui = ui,server = server)