如何在 Shiny 应用程序中使用文本输入选择 rhandsontable 中的单元格范围?

问题描述 投票:0回答:1

我目前正在 R 中开发一个 Shiny 应用程序,其中包含

rhandsontable
元素。我想添加一个功能,用户可以在文本输入字段中指定单元格范围(例如“A1:B2”),然后
rhandsontable
将在表格上选择该范围。

这是我当前代码的简化版本:

library(shiny)
library(rhandsontable)

ui <- fluidPage(
    textInput("cell_range", "Enter cell range:"),
    rHandsontableOutput("table")
)

server <- function(input, output) {
    output$table <- renderRHandsontable({
        df <- data.frame(A = 1:5, B = 6:10, C = 11:15)
        rhandsontable(df)
    })
}

shinyApp(ui = ui, server = server)

这是预期的结果:

我不确定如何继续单元格范围选择部分。我浏览了

rhandsontable
文档,但找不到直接的方法来执行此操作。

javascript r shiny handsontable rhandsontable
1个回答
1
投票

这是一种方法,但它不允许输入Excel单元格范围。相反,您必须输入单元格范围为

rowStart:columnStart:rowEnd:columnEnd

library(shiny)
library(rhandsontable)
library(htmlwidgets)

js <- c(
  "function(el, x) {",
  "  let hot = this.hot;",
  "  $('#cell_range').on('keyup', function(e) {",
  "    if(e.keyCode == 13) {",
  "      let cellRange = $('#cell_range').val();",
  "      let x = cellRange.split(':');",
  "      let rowStart    = parseInt(x[0]) - 1;",
  "      let columnStart = parseInt(x[1]) - 1;",
  "      let rowEnd      = parseInt(x[2]) - 1;",
  "      let columnEnd   = parseInt(x[3]) - 1;",
  "      hot.selectCells([[rowStart, columnStart, rowEnd, columnEnd]]);",
  "    }",
  "  });",
  "}"
)

ui <- fluidPage(
  textInput(
    "cell_range", 
    "Enter cell range (rowStart:columnStart:rowEnd:columnEnd) and press Enter:"
  ),
  rHandsontableOutput("table")
)

server <- function(input, output) {
  output$table <- renderRHandsontable({
    df <- data.frame(A = 1:5, B = 6:10, C = 11:15)
    rhandsontable(df) %>% onRender(js)
  })
}

shinyApp(ui = ui, server = server)

如果您想使用按钮而不是按 Enter 键来触发范围选择,您可以执行以下操作:

js <- c(
  "function(el, x) {",
  "  let hot = this.hot;",
  "  $('#submit').on('click', function(e) {",
  "      let cellRange = $('#cell_range').val();",
  "      let x = cellRange.split(':');",
  "      let rowStart    = parseInt(x[0]) - 1;",
  "      let columnStart = parseInt(x[1]) - 1;",
  "      let rowEnd      = parseInt(x[2]) - 1;",
  "      let columnEnd   = parseInt(x[3]) - 1;",
  "      hot.selectCells([[rowStart, columnStart, rowEnd, columnEnd]]);",
  "  });",
  "}"
)

ui <- fluidPage(
  textInput(
    "cell_range", 
    "Enter cell range (rowStart:columnStart:rowEnd:columnEnd) and press the button:"
  ),
  actionButton("submit", "Submit"),
  rHandsontableOutput("table")
)
© www.soinside.com 2019 - 2024. All rights reserved.