r - 如何避免 Shiny R 图中的闪烁错误?

标签 r shiny shiny-reactivity

我从 J. Cheng 那里找到了这段代码作为 freezeReactiveValue 的一个例子。
但是,在显示绘图之前,偶尔会暂时显示错误以代替绘图。 (需要对输入进行一些更改才能获得此结果。)据我了解,问题是在短时间内 - X 和 Y(列)保留为先前的数据集,并且不匹配新数据集。例如,我在选择“压力”数据集后一秒钟收到错误消息“FUN 中的错误:找不到对象‘速度’”。 (但前提是事先使用 x=Speed 和 y=pressure 选择了“cars”数据集。)显然,该图试图在有机会更新之前获取 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)

最佳答案

这与 react 性优先级有关,并与“选择无效”有关。我认为确保原子更新(对数据和输入)的唯一方法,您需要将数据更新和输入更改组合到同一个块或风险依赖块中,这些块按所需顺序执行(即, react 链中有多个路径)。

一种方法是对所有事情都使用副作用,而不仅仅是分配 $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 后立即更新被改变。

关于r - 如何避免 Shiny R 图中的闪烁错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50340172/

相关文章:

R Shiny : cannot download interactive report

javascript - 如何在 Shiny R 应用程序中设置 DataTables 行回调?

r - 是否可以使用rMaps在R中的 map 上绘制路线?

r - Shiny 应用程序的代码分析?

r - 在 Shiny 的 react 值中使用分配?

r - 我可以在响应对象更改时保存它的旧值吗?

r - 如何使用 colnames 作为循环的主标题

r - R:将列表元素从函数输入转换为表达式

r - 如何在不添加 "Row.names"列的情况下按行名合并数据帧?

r - 使用 Shiny 响应式地提供图像