我正在尝试向我的Shiny应用程序添加“保存输入”功能,其中保存的输入将保存在DT数据表中。如果用户单击添加按钮,则输入将附加到数据表中。然后,用户可以通过选择一行并单击删除按钮从此数据表中删除一行。我还需要将该表的值另存为全局变量,以使其在所有会话中保持不变。
示例代码如下所示。当我关闭会话时,表(this_table
)已正确更新,但是,这些更改在应用程序期间不会实时显示。我曾尝试将这两个输入按钮都放在eventReactive
函数中,但是当多次选择一个按钮时,此操作不起作用。
有什么想法吗?
全局表:
this_table = data.frame(bins = c(30, 50), cb = c(T, F))
闪亮的应用代码:
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
checkboxInput("cb", "T/F"),
actionButton("add_btn", "Add"),
actionButton("delete_btn", "Delete")
),
mainPanel(
DTOutput("shiny_table")
)
)
)
server <- function(input, output) {
observeEvent(input$add_btn, {
t = rbind(data.frame(bins = input$bins,
cb = input$cb), this_table)
this_table <<- t
})
observeEvent(input$delete_btn, {
t = this_table
print(nrow(t))
if (!is.null(input$shiny_table_rows_selected)) {
t <- t[-as.numeric(input$shiny_table_rows_selected),]
}
this_table <<- t
})
output$shiny_table <- renderDT({
datatable(this_table, selection = 'single', options = list(dom = 't'))
})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:2)
您可以使用reactiveVal
来添加可观察和可变的服务器端变量。这些变量的语法是将其初始化为
rV <- reactiveValue("init_value")
并使用
进行更新rV("new_value")
可以在反应性上下文(基本上像input
s)中通过以下方式访问这些变量
rV()
对于R来说,语法很不寻常,可能需要一段时间才能习惯,但是绝对是解决此类问题的推荐方法。您可能还想看看reactiveValues
具有相似的功能,但其语义更接近R类list
。
以下是如何将这种技术应用于您的问题
library(shiny)
library(DT)
this_table = data.frame(bins = c(30, 50), cb = c(T, F))
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
checkboxInput("cb", "T/F"),
actionButton("add_btn", "Add"),
actionButton("delete_btn", "Delete")
),
mainPanel(
DTOutput("shiny_table")
)
)
)
server <- function(input, output) {
this_table <- reactiveVal(this_table)
observeEvent(input$add_btn, {
t = rbind(data.frame(bins = input$bins,
cb = input$cb), this_table())
this_table(t)
})
observeEvent(input$delete_btn, {
t = this_table()
print(nrow(t))
if (!is.null(input$shiny_table_rows_selected)) {
t <- t[-as.numeric(input$shiny_table_rows_selected),]
}
this_table(t)
})
output$shiny_table <- renderDT({
datatable(this_table(), selection = 'single', options = list(dom = 't'))
})
}
shinyApp(ui = ui, server = server)
最后,我想补充一点,@ Vishesh Shrivastavs建议使用rhandsontable
包也是可行的方法,尽管这样做肯定会失去一些灵活性。