我发现这个代码是J.Cheng提供的freezeReactiveValue的例子。但是,在绘图显示之前,有时会瞬间显示错误而不是绘图(需要更改几次输入才能得到)。据我所知,问题在于短时间内X和Y(列)保留了先前数据集的值,并且与新数据集不匹配。例如,当我选择“压力”数据集时,我会在一秒钟后收到错误消息“Error in FUN: object 'speed' not found”。(但是,只有在之前选择了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()
我不使用 Shiny,所以不知道正确的方法... 在这种情况下,你也可以删除Sys.sleep
。 - rawr