Shiny 和 ggplot - 同时使用 scale_x_ 和 scale_y_continuous 时出错

Posted

技术标签:

【中文标题】Shiny 和 ggplot - 同时使用 scale_x_ 和 scale_y_continuous 时出错【英文标题】:Shiny and ggplot - error when using both scale_x_ and scale_y_continuous 【发布时间】:2015-09-04 20:31:27 【问题描述】:

背景:这很奇怪。从本质上讲,我正在开发一个闪亮的应用程序,人们可以在其中从特定网站中提取 csv 导出,上传它然后与之交互。因为数字很大(数百万),它默认为科学记数法,这在眼睛上并不容易,所以我试图使用“labels = comma”来纠正这个问题。

问题:当我在 ggplot 函数中同时具有 scale_x_cont 和 scale_y_cont 时,应用程序崩溃。当我只有 x 或 y 时,它运行良好。

现在我尝试编写尽可能小的可重现代码,但是当我使用 mtcars 和相同的 selectInput 方法编写了一个简单的代码时,它运行良好,同时 scale_x_cont 和 scale_y_cont 都没有错误...

错误

eval(substitute(expr), envir, enclos) 中的错误: geom_point 需要以下缺失的美学:x, y 错误:geom_point 需要以下缺失的美学:x, y

要复制的最小 CSV

https://raw.githubusercontent.com/nzcoops/datasets/master/dump_test

应用

require(shiny)
require(DT)
require(ggplot2)
require(scales)
runApp(
  list(
    ui = fluidPage(
      sidebarPanel(fileInput('file1', 'Choose CSV File',
                             accept=c('text/csv', 
                                      'text/comma-separated-values,text/plain', 
                                      '.csv')),
                   htmlOutput("contents2"),
                   htmlOutput("contents3")
      ),
      mainPanel(
        plotOutput("plot1"),
        dataTableOutput("contents4")
      )
    ),

    server = function(input, output, session) 

      contents1 <- reactive(
        inFile <- input$file1
        if (is.null(inFile))
          return(NULL)
        dat <<- read.csv(inFile$datapath)
        dat[,2:5] <<- lapply(dat[,2:5],function(x)as.numeric(gsub(",", "", x)))
        names(dat)
      )

      output$contents2 <- renderUI(
        if (is.null(input$file1))
          return(NULL)
        selectInput('columnsx', 'Columns X', contents1()[3:5])
      )

      output$contents3 <- renderUI(
        if (is.null(input$file1))
          return(NULL)
        selectInput('columnsy', 'Columns Y', contents1()[3:5])
      )

      output$contents4 <- renderDataTable(
        if (is.null(input$file1))
          return(NULL)
        dat
      , options = list(paging = FALSE, searching = FALSE))

      output$plot1 <- renderPlot(
        if (is.null(input$file1))
          return(NULL)
        p <- ggplot(dat, aes_string(x=input$columnsx, y=input$columnsy)) +
          geom_point() + 
          scale_x_continuous(labels = comma) #+ scale_y_continuous(labels = comma)
        # Remove the above hash and the presence of scale_y_ will crash app
        print(p)
      )
    
  ))

【问题讨论】:

只有 ggplot 代码可以工作吗,除了闪亮但有麻烦的数据吗? @tegancp 是的,确实如此,我对此进行了一些测试,尽管它可能是导致问题的“aes_string”部分。 【参考方案1】:

您在函数中进行了一些时髦的范围界定。如果您将函数的第一行替换为:

p <- ggplot(dat, aes_string(x=dat[input$columnsx], y=dat[input$columnsy]))

一切都会好的。

【讨论】:

谢谢@jeremycg。你能解释一下范围,或者你能发现明显的错误吗?我很惊讶这是一个范围界定问题,因为当只有 scale_x 或 scale_y 之一存在时它工作正常?您的解决方案的一个问题(我可以确认有效)是您在轴上没有得到正确的名称,您会得到可怕的长向量,当然,可以通过添加 labs(x=input$columnsx) 来修复.嗯。 我真的不明白为什么它不起作用 - ggplot 在函数内部做了一些奇怪的范围界定工作 - 参见例如 - ***.com/questions/10659133/local-variables-within-aes。我猜 aes_string 解释 input$columnx 的方式导致了问题。

以上是关于Shiny 和 ggplot - 同时使用 scale_x_ 和 scale_y_continuous 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 ggplot 气泡图导入 Shiny 时出错

使用Shiny滑块控制ggplot上的输出

R和Shiny:当悬停在Shiny上的绘图上时显示ggplot2数据值

将 ggplot 与 r-shiny 一起使用时出错

R shiny ggplot - 如何不让年份标签超出网格?

为啥这个简单的 R Shiny 输出不使用 ggplot 绘图?