如何避免 Shiny R 图中的闪烁错误?
Posted
技术标签:
【中文标题】如何避免 Shiny R 图中的闪烁错误?【英文标题】:How do i avoid flashing errors in Shiny R plot? 【发布时间】:2018-10-24 16:41:25 【问题描述】:我从 J. Cheng 那里找到了这段代码作为 freezeReactiveValue 的示例。 但是,在显示绘图之前,有时会暂时显示错误以代替绘图。 (需要对输入进行一些更改才能获得此结果。)据我了解,问题是在短时间内 - X 和 Y(列)保留在前一个数据集上,并且不匹配新的数据集。例如,我在选择“压力”数据集后一秒钟收到错误消息“FUN 中的错误:找不到对象'速度'”。 (但前提是事先使用 x=Speed 和 y=pressure 选择了“汽车”数据集。)显然,该图试图在有机会更新之前获取 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)
【问题讨论】:
您可以向req
添加另一项检查以查看 x 和 y 是否在数据集中:data <- dataset(); req(input$dataset, input$x, input$y, all(c(input$x, input$y) %in% colnames(data))); ggplot(data, aes_string(input$x, input$y)) + geom_point()
我不使用闪亮的所以 idk 正确的方式.. 在这种情况下你也可以删除Sys.sleep
谢谢@rawr,这对我有用,但我希望有一个更通用的解决方案 - 一种检查 X 和 Y 输入是否为 """fresh""" 并已更新的方法数据集输入更改后。 - 原因是 - 我有一个真正的问题,我试图根据这个例子来解决,(这里的例子中的数据很难重现。) - 在我的例子中,旧 x,y 和新/新之间的区别x, y 输入不像在这种情况下那么清楚,因此我很困惑如何知道我在更新后使用 x/y 值。谢谢!
【参考方案1】:
这有点关于反应性优先级,并与“选择无效”有关。我认为确保原子更新(对数据和输入)的唯一方法是,您需要将数据更新和输入更改组合到同一个块中,或者风险相关的块被按照期望的顺序执行(即,反应链中有多个路径)。
一种方法是对所有内容都使用副作用,而不仅仅是分配$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
更改后立即更新。
【讨论】:
以上是关于如何避免 Shiny R 图中的闪烁错误?的主要内容,如果未能解决你的问题,请参考以下文章
R Shiny:交互式输入从 rds 文件进入 ggplot 时出错(评估中的错误:找不到对象'x')