javascript - 重置rhandsontable中的选定范围

标签 javascript r shiny handsontable rhandsontable

在下面的示例中,每次生成新数据集时如何重置选定的单元格范围?

library(shiny)
library(data.table)
library(rhandsontable)

shinyApp(
  ui = fluidPage(
    actionButton('gendata', 'Generate data'),
    hr(),
    verbatimTextOutput('verb'),
    hr(),
    rHandsontableOutput('table_original'),
    hr(),
    rHandsontableOutput('table_subset')
  ),
  
  server = function(input, output, session) {
    mydata <- reactive({
      req(input$gendata)
      n_dim <- sample(2:8, 1)
      data.table( matrix(rnorm(n_dim**2), n_dim, n_dim) )
    })
    output$table_original <- renderRHandsontable({
      req(mydata())
      rhandsontable(data = mydata(), selectCallback = TRUE)
    })
    output$table_subset <- renderRHandsontable({
      req(input$table_original_select$select)
      selected_rows <- input$table_original_select$select$rAll
      selected_cols <- input$table_original_select$select$cAll
      DT <- hot_to_r(input$table_original)
      DT <- DT[selected_rows, ..selected_cols] # subset
      rhandsontable(DT)
    })
    output$verb <- renderPrint({
      str(input$table_original_select$select)
    })
  }
)

编辑 1
我认为解决方案可能是使用 javascript,但我对这种语言不够熟悉,无法弄清楚。请参阅this发布。


编辑2
我设法避免了生成新数据集且先前范围大于当前数据集时发生的错误。还是希望能有更好的解决方案。

library(shiny)
library(data.table)
library(rhandsontable)

shinyApp(
  ui = fluidPage(
    actionButton('gendata', 'Generate data'),
    hr(),
    verbatimTextOutput('verb'),
    hr(),
    rHandsontableOutput('table_original'),
    hr(),
    rHandsontableOutput('table_subset')
  ),
  
  server = function(input, output, session) {
    
    first_range_selection <<- TRUE
    
    mydata <- reactive({
      req(input$gendata)
      n_dim <- sample(2:8, 1)
      data.table( matrix(rnorm(n_dim**2), n_dim, n_dim) )
    })
    
    observeEvent(mydata(), {
      if (first_range_selection) {
        reset_range <<- FALSE
        first_range_selection <<- FALSE
      } else {
        reset_range <<- TRUE
      }
    })
    
    output$table_original <- renderRHandsontable({
      req(mydata())
      rhandsontable(data = mydata(), selectCallback = TRUE)
    })
    output$table_subset <- renderRHandsontable({
      req(input$table_original_select$select)
      if (reset_range) {
        reset_range <<- FALSE
        return()
      }
      selected_rows <- input$table_original_select$select$rAll
      selected_cols <- input$table_original_select$select$cAll
      DT <- hot_to_r(input$table_original)
      DT <- DT[selected_rows, ..selected_cols] # subset
      rhandsontable(DT)
    })
    output$verb <- renderPrint({
      str(input$table_original_select$select)
    })
  }
)

最佳答案

您可以编程两个observeEvent:

  • input$gendata 处将 output$table_subset 重置为 NULL
  • input$table_original_select 处创建 output$table_subset

这样在我这边工作得很好:

library(shiny)
library(data.table)
library(rhandsontable)

shinyApp(
  ui = fluidPage(
    actionButton('gendata', 'Generate data'),
    hr(),
    verbatimTextOutput('verb'),
    hr(),
    rHandsontableOutput('table_original'),
    hr(),
    rHandsontableOutput('table_subset')
  ),
  
  server = function(input, output, session) {
    
    mydata <- reactive({
      req(input$gendata)
      n_dim <- sample(2:8, 1)
      data.table( matrix(rnorm(n_dim**2), n_dim, n_dim) )
    })
    
    output$table_original <- renderRHandsontable({
      req(mydata())
      rhandsontable(data = mydata(), selectCallback = TRUE)
    })
    
    observeEvent(input$gendata, {
      output$table_subset <- NULL
    })
    
    observeEvent(input$table_original_select, {
      output$table_subset <- renderRHandsontable({
        req(input$table_original_select$select)
        selected_rows <- input$table_original_select$select$rAll
        selected_cols <- input$table_original_select$select$cAll
        DT <- hot_to_r(input$table_original)
        DT <- DT[selected_rows, ..selected_cols] # subset
        rhandsontable(DT)
      })
    })
    
    output$verb <- renderPrint({
      str(input$table_original_select$select)
    })
  }
)

关于javascript - 重置rhandsontable中的选定范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75753429/

相关文章:

javascript - 使用 TAB 编辑 DT 表上的下一个单元格

R Shiny 组按钮,具有单独的悬停下拉选择

javascript - 'array[array.length - 1] = array.pop()' 会产生未定义的行为吗?

javascript - 为什么我们需要在这里使用$scope?

r - 如何根据第二个数据帧中的一系列可能值合并两个数据帧,但保留第一个数据帧的值?

r - 如何使用 downloadHandler 以 Shiny 方式下载 rCharts 图表

javascript - D3 JS 附加到 div 奇怪的结果

javascript - 是否可以通过一个项目在 Window 和 Linux 上进行编码? (使用 yarn 、 react )

r - 在 dcast 中对列进行排序

r - 两组数据的组合 corrplot?