Ошибка в .getReactiveEnvironment () $ currentContext () при использовании реактивного вывода в функции реактивные значения - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь получить значение реактивного, которое зависит от реактивного. В реальном коде (это очень упрощенная версия) я загружаю набор данных в интерактивном режиме. Изменяется при нажатии кнопок (prevBtn / nextBtn). Мне нужно знать количество строк в наборе данных, используя это для построения точек данных разными цветами.

Вопрос: почему я не могу использовать реактивный ro () в функции реактивных значений?

Для понимания: почему ошибка говорит "You tried to do something that can only be done from inside a reactive expression or observer.", хотя ro () используется внутри реактивного контекста.

Ошибка определенно связана с vals (), остальное я уже проверил.

код:

library(shiny)
datasets <- list(mtcars, iris, PlantGrowth)
ui <- fluidPage(
    mainPanel(
        titlePanel("Simplified example"),
        tableOutput("cars"),
        actionButton("prevBtn", icon = icon("arrow-left"), ""),
        actionButton("nextBtn", icon = icon("arrow-right"), ""),
        verbatimTextOutput("rows")
    )
)
server <- function(input, output) {
    output$cars <- renderTable({
        head(dat())
    })
    dat <- reactive({
        if (is.null(rv$nr)) {
            d <- mtcars
        }
        else{
            d <- datasets[[rv$nr]]
        }
    })
    rv <- reactiveValues(nr = 1)
    set_nr <- function(direction) {
        rv$nr <- rv$nr + direction
    }
    observeEvent(input$nextBtn, {
        set_nr(1)
    })
    observeEvent(input$prevBtn, {
        set_nr(-1)
    })
    ro <- reactive({
        nrow(dat())
    })
    output$rows <- renderPrint({
        print(paste(as.character(ro()), "rows"))
    })
    vals <- reactiveValues(needThisForLater = 30 * ro())
}
shinyApp(ui = ui, server = server)

Ошибка в .getReactiveEnvironment()$currentContext():

Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

1 Ответ

0 голосов
/ 05 июня 2019

Я думаю, что вы хотите

vals <- reactiveValues(needThisForLater = reactive(30 * ro()))

Не все в списке reactiveValues считаются реактивными. Это также хорошее место для хранения постоянных значений. Таким образом, поскольку он пытается оценить параметр, который вы передаете во время выполнения, и вы не вызываете эту строку в реактивной среде, вы получаете эту ошибку. Таким образом, просто заключив его в вызов reactive(), вы создаете реактивную среду для вызова ro().

...