R 闪亮:如何在每次按下 actionButton 时更新反应数据框而不创建新的反应数据框?
R shiny: How to get an reactive data frame updated each time pressing an actionButton without creating a new reactive data frame?
我闪亮的应用程序允许用户使用 fileInput 上传一个 csv 并存储为反应对象 df_data。然后我创建了一个 numericInput 供用户输入要从数据框中删除的行号。但是,我得到一个关于 evaluation nested too deeply: infinite recursion / options(expressions=)?.
的错误
下面是我的 ui.R 代码。
shinyUI(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data")
)
))
下面是我的代码 server.R。
shinyServer(function(input, output) {
df_data <- reactive({
read.csv(input$file$datapath)
})
df_data <- eventReactive(
input$Go,
df_data()[-input$Delete,]
)
output$df_data <- renderTable(df_data())
})
我通过将子集数据框分配给一个名为 df_data2 的新反应式数据框解决了这个问题。但我想让用户能够通过在 Delete row 中输入值并按下 Go 按钮来继续删除不同的行。那么这个解决方案将不起作用,因为我必须分配 df_data3,df_data4 ...而且我无法提前预测用户将按 Go 多少次 按钮。
我是 shiny 的新用户,已经使用了大约 2 周时间,并且我已经为此搜索了一个星期的解决方案。有没有人可以帮助我?一百万个感谢!!
下面是一个可行的解决方案。我创建了一个 reactiveValues
来存储数据框。选择文件后,将填充数据框。当按下删除按钮时,同一数据框会删除一行。 table 始终输出该数据框对象所持有的任何内容。希望这段代码能好好学习material
runApp(shinyApp(
ui=(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data_out")
)
)),
server = (function(input, output) {
values <- reactiveValues(df_data = NULL)
observeEvent(input$file, {
values$df_data <- read.csv(input$file$datapath)
})
observeEvent(input$Go, {
temp <- values$df_data[-input$Delete, ]
values$df_data <- temp
})
output$df_data_out <- renderTable(values$df_data)
})))
我闪亮的应用程序允许用户使用 fileInput 上传一个 csv 并存储为反应对象 df_data。然后我创建了一个 numericInput 供用户输入要从数据框中删除的行号。但是,我得到一个关于 evaluation nested too deeply: infinite recursion / options(expressions=)?.
的错误下面是我的 ui.R 代码。
shinyUI(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data")
)
))
下面是我的代码 server.R。
shinyServer(function(input, output) {
df_data <- reactive({
read.csv(input$file$datapath)
})
df_data <- eventReactive(
input$Go,
df_data()[-input$Delete,]
)
output$df_data <- renderTable(df_data())
})
我通过将子集数据框分配给一个名为 df_data2 的新反应式数据框解决了这个问题。但我想让用户能够通过在 Delete row 中输入值并按下 Go 按钮来继续删除不同的行。那么这个解决方案将不起作用,因为我必须分配 df_data3,df_data4 ...而且我无法提前预测用户将按 Go 多少次 按钮。
我是 shiny 的新用户,已经使用了大约 2 周时间,并且我已经为此搜索了一个星期的解决方案。有没有人可以帮助我?一百万个感谢!!
下面是一个可行的解决方案。我创建了一个 reactiveValues
来存储数据框。选择文件后,将填充数据框。当按下删除按钮时,同一数据框会删除一行。 table 始终输出该数据框对象所持有的任何内容。希望这段代码能好好学习material
runApp(shinyApp(
ui=(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data_out")
)
)),
server = (function(input, output) {
values <- reactiveValues(df_data = NULL)
observeEvent(input$file, {
values$df_data <- read.csv(input$file$datapath)
})
observeEvent(input$Go, {
temp <- values$df_data[-input$Delete, ]
values$df_data <- temp
})
output$df_data_out <- renderTable(values$df_data)
})))