【问题标题】:Shiny rhandsontable that is reactive to itself对自身具有反应性的闪亮 rhandsontable
【发布时间】:2019-04-10 03:45:14
【问题描述】:

我正在尝试创建一个包含 rhandsontable 的闪亮应用程序。如果选择/检查了另一列中的相应值,我希望 rhandsontable 能够更新其列中的值。到目前为止,我已经能够使用响应式/观察事件来更改两个对象之间的输出值,但我无法绕开它,即,我如何使 rhandsontable 的一次列对同一张表中的另一列具有反应性?

这是我正在尝试构建的一个简单示例:

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  rHandsontableOutput('table')

)

server <- function(input,output,session)({

  data <- data.frame(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0), select= as.logical( c(FALSE,FALSE,FALSE)))

  output$table <- renderRHandsontable({
    rhandsontable(data)
  })


}) 

shinyApp(ui = ui, server = server)

因此,如果我检查“选择”列,“差异”列应该会产生 c1 和 c2 列之间的差异

【问题讨论】:

    标签: r shiny rhandsontable


    【解决方案1】:

    据我了解,您的目标是根据其他列的值进行一些计算。因此,例如,如果选中了第三列的框,您可能需要计算第 1 列和第 2 列元素之间的差异。

    如果您只有一个数据框,那会很简单,不是吗?好吧,这可以使用反应值。主要思想是您可以将rhandsontable存储在后端的数据帧中,修改数据帧,然后将修改后的数据帧再次渲染回handsontable。

    我希望这会有所帮助:

    有关反应值的更详细示例,您可以查看 这个:http://stla.github.io/stlapblog/posts/shiny_editTable.html 还有这个:https://www.youtube.com/watch?v=BzE1JmC0F6Q&list=PL6wLL_RojB5wXR3NR3K38sIvexZ_45alY&index=3

    library(rhandsontable)
    library(shiny)
    
    
    ui <- fluidPage(
      mainPanel(
        rHandsontableOutput("hot")
      )
    )
    
    server = function(input, output, session){
    
      df<- data.frame(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0), select= as.logical( c(FALSE,FALSE,FALSE)))
      values <- reactiveValues(data = df)
    
      observe({
        if(!is.null(input$hot)){
          values$data <- as.data.frame(hot_to_r(input$hot))
          isolate(values$data[,'diff'] <- ifelse(values$data[,'select'], values$data[,'c1']-values$data[,'c2'] ,0))
          print(values$data)
          output$hot <- renderRHandsontable({
            rhandsontable(values$data)
          })
        }
      })    
    
      output$hot <- renderRHandsontable({
        rhandsontable(values$data)
      })
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 谢谢,您的回答很有帮助。但是,我注意到刷新页面时修改消失了。有没有简单的解决方案来保持修改?谢谢
    • 第一个output$hot &lt;- renderRHandsontable是多余的吗?如果你修改 values$data 那么第二个会被触发吗?
    • @Xiaoshi 我猜你只需要实际移动命令 df
    • @SimonWoodward 是的,你是对的!感谢您的评论。我这样做是有原因的(如果没有在观察事件中添加这个额外的渲染,我创建了一些应用程序,其中一些事件由于某种原因没有被触发)。但距离我上次与 Rhandsontable 合作已经很久了,我现在已经记不得了。
    猜你喜欢
    • 2017-06-28
    • 2019-07-19
    • 2021-01-17
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2022-01-16
    相关资源
    最近更新 更多