R Shiny:交互式输入从 rds 文件进入 ggplot 时出错(评估中的错误:找不到对象'x')

Posted

技术标签:

【中文标题】R Shiny:交互式输入从 rds 文件进入 ggplot 时出错(评估中的错误:找不到对象\'x\')【英文标题】:R Shiny: error when interactive input goes into a ggplot from rds file (Error in eval: object 'x' not found)R Shiny:交互式输入从 rds 文件进入 ggplot 时出错(评估中的错误:找不到对象'x') 【发布时间】:2017-04-18 18:57:07 【问题描述】:

我想使用 R 的 shiny 包生成一个应用程序。我想从另一个项目上传 ggplots 并添加一些交互式内容。

当我使用 geom_point() 将数据点添加到在同一 R 代码中创建的 ggplot 中时,这可以正常工作。但是,当我再次保存并重新读取 ggplot (*) 时,会发生错误。我仍然可以添加geom_point (**),但它不接受来自input$slider 的交互内容。

ui.R

library(shiny)

shinyUI(

  fluidPage(

    # Title
    titlePanel(""),

    # sidebar
    sidebarLayout(

      sidebarPanel("",
                   sliderInput("slider", "slider",
                               min = 100, max = 500, value = 300, step = 10)
      ),

      # Main
      mainPanel("",

                plotOutput("ggplt")
      )
    )
  )
)

server.R

library(shiny)

shinyServer(

  function(input, output)

    # produce a plot
    output$ggplt <- renderPlot(

      # ggplot scatterplot
      library(ggplot2)
      gg <- ggplot(data = mtcars, aes(x = disp, y = mpg)) +
        geom_point()

      # (*) save ggplot
      #saveRDS(gg, "plt.rds")
      #rm(gg)
      #gg <- readRDS("plt.rds")

      # x-coordinate for geom_point 
      xc <- as.numeric(input$slider)

      gg + geom_point(aes(x = xc, y = 20), size = 5, colour = "red")

      ## (**) alternative
      #gg + geom_point(aes(x = 400, y = 20), size = 5, colour = "red")
    ) 

  
)

【问题讨论】:

见tagteam.harvard.edu/hub_feeds/1981/feed_items/2104863 【参考方案1】:

我真的不知道这里发生了什么,我认为这可能是 ggplot2 环境处理和闪亮的反应性环境处理之间的一些微妙的交互。可能值得将其标记为错误。

但是,有很多方法可以通过小改动使其正常工作。我认为最好的方法是对滑块值使用反应函数,尽管仅将 xc 与皱眉的 &lt;&lt;- 一起分配似乎也有效,而且变化较小。

您也可以直接在aes(..) 函数中使用input$slider,因为这似乎也可以,但是使用响应式函数感觉更干净。

所以这是我建议的解决方法:

library(shiny)
library(ggplot2)
u <- shinyUI(
  fluidPage(
    titlePanel(""),
    sidebarLayout(
      sidebarPanel("", sliderInput("slider", "slider",
                       min = 100, max = 500, value = 300, step = 10)
      ),
      mainPanel("", plotOutput("ggplt")
      )
)))
s <- shinyServer(  function(input, output)

    sliderval <- reactive(input$slider)

    output$ggplt <- renderPlot(
      req(input$slider)

      gg <- ggplot(data = mtcars) +
        geom_point(aes(x = disp, y = mpg))

      # (*) save ggplot
      saveRDS(gg, "plt.rds")
      rm(gg)
      gg <- readRDS("plt.rds")

      gg + geom_point(aes(x = sliderval(), y = 20), size = 5, colour = "red")
    ) 
)
shinyApp(u,s)

屈服:

【讨论】:

以上是关于R Shiny:交互式输入从 rds 文件进入 ggplot 时出错(评估中的错误:找不到对象'x')的主要内容,如果未能解决你的问题,请参考以下文章

R-Shiny:在文件输入上选择输入反应

如何在R / Shiny中将相机方向固定在交互式3D绘图中

R - Shiny 上的实时图表

通过 Shiny Server 将 Shiny 输入传递给 R markdown

构建Shiny应用

Shiny App:从上传的文件中获取输入选择