【问题标题】:How to use original and updated version of reactive data.table in Shiny?如何在 Shiny 中使用原始和更新版本的响应式 data.table?
【发布时间】:2019-07-10 10:57:53
【问题描述】:

我正在尝试在 Shiny 应用程序中包含一个数据集,该应用程序首先被读取并按原样使用,例如通过将其显示为表格。我希望用户能够操作此数据集并使用更新后的数据集更新相同的表输出。

我可以让这两个部分分别工作 - 我可以显示原始数据,也可以显示反应性更新数据。但我不知道如何让两者都使用相同的数据集?下面的代码是一个使用 iris 的简单示例,它尝试显示原始数据集,然后对其进行 rbinding,以便在您点击“运行”时在更新的数据集中显示两倍的行数。请注意,我已将数据转换为 data.table,因为我的实际代码将大量使用 data.table。

library(shiny)
library(data.table)

iris <- as.data.table(iris)

ui <- fluidPage(
    fluidRow(column(4, actionButton("run", "Run"))),
    fluidRow(column(12, tabPanel(title = "tab1",
        DT::dataTableOutput("table1"))))
    )

server <- function(input, output, session) {

    irisdata <- reactive({
        irisdata <- iris
    })

    irisdata <- eventReactive(input$run, {
        rbind(irisdata(), iris, fill = TRUE)
    })

    output$table1 <- DT::renderDataTable({
        irisdata()
    })

}

shinyApp(ui, server)

rbind 导致:错误:嵌套太深:无限递归/选项(表达式=)?

我想这是可以预期的,因为它是自引用的,但我不知道如何编写代码?

【问题讨论】:

标签: r shiny


【解决方案1】:

上述示例的工作代码,基于 cmets 中的链接线程:

library(shiny)
library(data.table)

iris <- as.data.table(iris)

ui <- fluidPage(
    fluidRow(column(4, actionButton("run", "Run"))),
    fluidRow(column(12, tabPanel(title = "tab1",
                           DT::dataTableOutput("table1"))))
)

server <- function(input, output, session) {

    irisdata <- reactiveValues(data = iris)

    observeEvent(input$run, {
        irisdata$data <- rbind(irisdata$data, iris, fill = TRUE)
    })

    output$table1 <- DT::renderDataTable({
        irisdata$data
    })

}

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2017-09-19
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多