Как использовать оригинальную и обновленную версию реактивной data.table в Shiny? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь включить набор данных в приложение Shiny, которое сначала читается и используется как есть, например, отображая его в виде таблицы.Я хотел бы позволить пользователю затем иметь возможность манипулировать этим набором данных и обновлять тот же вывод таблицы с обновленным набором данных.

Я могу заставить обе части работать отдельно - я могу отображать исходные данные, и яможет отображать реактивные обновленные данные.Но я не могу понять, как заставить оба работать, используя один и тот же набор данных?Приведенный ниже код представляет собой простой пример использования iris с попыткой отобразить исходный набор данных, а затем привязать его, чтобы в обновленном наборе данных отображалось в два раза больше строк при нажатии «Выполнить».Обратите внимание, что я преобразовал данные в 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: Ошибка в: оценка вложена слишком глубоко: бесконечная рекурсия /options (выражения =)?

Что и следовало ожидать, я полагаю, что это самоссылка, но я не могу понять, как написать код в противном случае?

1 Ответ

0 голосов
/ 11 июля 2019

Рабочий код приведенного выше примера на основе связанных тем в комментариях:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...