如何重置为默认的反应式 rhandsontable?
How to reset to default a reactive rhandsontable?
我正在构建一个应用程序,其中 2×2 table 包含一些用于进一步计算的值。这些值可以由用户更新,用户可以恢复到原始值。
我正在尝试通过一个将 table 重置为其原始值的操作按钮来实现它,但 table 不会更新。这是一个简化的例子:
rm(list = ls())
library(shiny)
library(rhandsontable)
library(shinyjs)
server <- shinyServer(function(input, output, session) {
DF = data.frame(A = c(1, 2), B = c(3, 4), row.names = c("C", "D"))
vals <- reactiveValues(reset = FALSE)
## Initiate table
previous <- reactive({DF})
myChanges <- reactive({
if(is.null(input$two_by_two)) {
return(previous())
} else if(!identical(previous(),
input$two_by_two)){
mytable <- as.data.frame(hot_to_r(input$two_by_two))
mytable
}
})
output$two_by_two <- renderRHandsontable({
if(isolate(vals$reset) | is.null(input$two_by_two)) {
isolate(vals$reset <- FALSE)
df <- DF
} else df <- myChanges()
rhandsontable(df)
})
fctout = reactive({2*myChanges()})
output$chg_data = renderTable({fctout()}, rownames = TRUE)
observeEvent(input$reset_input, {
shinyjs::reset("test")
vals$reset <- TRUE
})
})
############ UI
ui <- shinyUI(fluidPage(
shinyjs::useShinyjs(),
id = "test",
h4("A table:"),
actionButton(inputId = "reset_input",
label = "Use example"),
br(),
rHandsontableOutput("two_by_two"),
br(),
tableOutput(outputId = "chg_data")
))
shinyApp(ui, server)
rhandsontable
可以反应并由 actionButton
更新吗?
欢迎使用 Whosebug!
这是一个工作示例(降低了复杂性):
library(shiny)
library(rhandsontable)
server <- shinyServer(function(input, output, session) {
DF <- data.frame(A = c(1, 2), B = c(3, 4), row.names = c("C", "D"))
output$two_by_two <- renderRHandsontable({
input$reset_input # trigger rendering on reset
rhandsontable(DF)
})
output$chg_data = renderTable({
hot_to_r(req({input$two_by_two}))*2}, rownames = TRUE)
})
ui <- shinyUI(fluidPage(
h4("A table:"),
actionButton(inputId = "reset_input", label = "Reset"),
br(),
rHandsontableOutput("two_by_two"),
br(),
tableOutput(outputId = "chg_data")
))
shinyApp(ui, server)
我正在构建一个应用程序,其中 2×2 table 包含一些用于进一步计算的值。这些值可以由用户更新,用户可以恢复到原始值。
我正在尝试通过一个将 table 重置为其原始值的操作按钮来实现它,但 table 不会更新。这是一个简化的例子:
rm(list = ls())
library(shiny)
library(rhandsontable)
library(shinyjs)
server <- shinyServer(function(input, output, session) {
DF = data.frame(A = c(1, 2), B = c(3, 4), row.names = c("C", "D"))
vals <- reactiveValues(reset = FALSE)
## Initiate table
previous <- reactive({DF})
myChanges <- reactive({
if(is.null(input$two_by_two)) {
return(previous())
} else if(!identical(previous(),
input$two_by_two)){
mytable <- as.data.frame(hot_to_r(input$two_by_two))
mytable
}
})
output$two_by_two <- renderRHandsontable({
if(isolate(vals$reset) | is.null(input$two_by_two)) {
isolate(vals$reset <- FALSE)
df <- DF
} else df <- myChanges()
rhandsontable(df)
})
fctout = reactive({2*myChanges()})
output$chg_data = renderTable({fctout()}, rownames = TRUE)
observeEvent(input$reset_input, {
shinyjs::reset("test")
vals$reset <- TRUE
})
})
############ UI
ui <- shinyUI(fluidPage(
shinyjs::useShinyjs(),
id = "test",
h4("A table:"),
actionButton(inputId = "reset_input",
label = "Use example"),
br(),
rHandsontableOutput("two_by_two"),
br(),
tableOutput(outputId = "chg_data")
))
shinyApp(ui, server)
rhandsontable
可以反应并由 actionButton
更新吗?
欢迎使用 Whosebug!
这是一个工作示例(降低了复杂性):
library(shiny)
library(rhandsontable)
server <- shinyServer(function(input, output, session) {
DF <- data.frame(A = c(1, 2), B = c(3, 4), row.names = c("C", "D"))
output$two_by_two <- renderRHandsontable({
input$reset_input # trigger rendering on reset
rhandsontable(DF)
})
output$chg_data = renderTable({
hot_to_r(req({input$two_by_two}))*2}, rownames = TRUE)
})
ui <- shinyUI(fluidPage(
h4("A table:"),
actionButton(inputId = "reset_input", label = "Reset"),
br(),
rHandsontableOutput("two_by_two"),
br(),
tableOutput(outputId = "chg_data")
))
shinyApp(ui, server)