Как избежать появления ошибок в графике Shiny R? - PullRequest
0 голосов
/ 15 мая 2018

Я нашел этот код от J. Cheng в качестве примера freezeReactiveValue.Однако перед отображением графика иногда на месте отображается ошибка.(Требуется несколько изменений входных данных, чтобы получить это.) Как я понимаю, проблема в том, что в течение короткого периода времени - X и Y (столбцы) остаются для предыдущего набора данных, и не совпадают доновый набор данных.Например, я получаю сообщение об ошибке «Ошибка в FUN: объект« скорость »не найден» в течение секунды после выбора набора данных «давление».(но только если заранее был выбран набор данных "cars" с x = Speed ​​и y = давление.) Очевидно, что график пытается захватить переменную x до того, как она будет обновлена, но я не знаю, как это предотвратить.происходит.Буду признателен за любые советы, которые у вас есть !!!Спасибо!

library(shiny)
library(ggplot2)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("dataset", "Dataset", c("cars", "pressure", "mtcars")),
      selectInput("x", "x variable", character(0)),
      selectInput("y", "y variable", character(0))
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)

server <- function(input, output, session) {
  dataset <- reactive({
    get(input$dataset, "package:datasets")
  })

  observe({
    freezeReactiveValue(input, "x")
    freezeReactiveValue(input, "y")
    columns <- names(dataset())
    updateSelectInput(session, "x", choices = columns, selected =    columns[[1]])
    updateSelectInput(session, "y", choices = columns, selected = columns[[2]])
  })

  output$plot <- renderPlot({
    Sys.sleep(2)
    req(input$dataset,input$x,input$y)
    ggplot(dataset(), aes_string(input$x, input$y)) + geom_point()
  })
}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 15 мая 2018

Это немного о приоритете реактивности и связано с «отменой выборов».Я думаю, что единственный способ быть уверенным в атомарном обновлении (как для данных, так и для входных данных), это объединить обновления данных и входные изменения в один и тот же блок или блоки, зависящие от риска, которые выполняются из требуемого порядка (т.е.есть несколько путей в цепочке реактивности).

Одним из способов является использование побочного эффекта для всего, а не просто присвоение $x и $y.(Я все еще ищу решение, которое не требует этого побочного эффекта ...) (Я заимствую из комментария @ rawr.)

Используя ваш ui, попробуйте это:

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

  observeEvent(input$dataset, {
    req(input$dataset)
    x <- get(input$dataset, "package:datasets")
    columns <- names(x)
    updateSelectInput(session, "x", choices = columns, selected = columns[[1L]])
    updateSelectInput(session, "y", choices = columns, selected = columns[[2L]])
    dataset(x)
  })

  output$plot <- renderPlot({
    req(dataset())
    columns <- names(dataset())
    req(all(c(input$x, input$y) %in% columns))
    ggplot(dataset(), aes_string(input$x, input$y)) + geom_point()
  })
}

где я поместил присвоение 'x' и 'y' в один и тот же блок наблюдения, который переназначает данные.При этом вы относительно гарантированно обновите selectInput s сразу после изменения input$dataset.

...