我目前正在 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
文档,但找不到直接的方法来执行此操作。
这是一种方法,但它不允许输入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")
)