问题描述
我已经使用R已有一段时间了,但是R Shiny在我看来完全是一种外语。
我有一个使用Rhsonsontable的RShiny应用程序,该应用程序从Rhsonsontable中的另一列和Rhsonsontable外部获取输入以计算新列。目前,当修改表中的任何条目时,该表都会更新所有内容,但是我想通过使Rhandsontable对表内外的变化都做出反应来尽量降低用户出错的风险(首选)或单击按钮时重置。
下面的示例是从How to reset to default a reactive rhandsontable?修改而来的,但复制了我的问题。一旦我添加了一个rhendsontable的observeEvent,即使在我调用外部输入之前,重置按钮也不再起作用。
为了使observeEvent对外部输入和表更改均具有反应性,我尝试做出响应式输入(例如,listener <- reactive(c(input$two_by_two$changes$changes,input$reset_input))
),并将它们都放入observeEvent(例如,{{1})中}),都导致input$two_by_two$changes$changes | input$reset_input
错误。
Warning: Error in do.call: second argument must be a list
再次感谢您的帮助。
解决方法
之所以无法重置,是因为您已经更改了反应式数据框,但从未将其重置。我添加了一个新的观察事件来处理。请查看这是否是您想要的。
library(shiny)
library(rhandsontable)
server <- shinyServer(function(input,output,session) {
FACTOR <- reactive(input$factor_val)
DF <- data.frame(A = c(1,2),B = c(2,4),row.names = c("C","D"))
DF1 <- reactiveValues(data=DF)
observeEvent(input$reset_input,{
DF1$data <- DF
})
output$two_by_two <- renderRHandsontable({
#input$reset_input
rhandsontable(DF1$data)
})
observeEvent(input$factor_val,{
req(input$factor_val)
DF1$data <- hot_to_r(req({input$two_by_two}))
DF1$data[,2] = DF1$data[,1]*FACTOR()
})
})
ui <- shinyUI(fluidPage(
actionButton(inputId = "reset_input",label = "Reset"),br(),numericInput("factor_val","Multiplier Value",min=0,max=10,value=2),rHandsontableOutput("two_by_two")
))
shinyApp(ui,server)