在下面的示例中,每次生成新数据集时如何重置选定的单元格范围?
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/