【问题标题】:How to Pass Shiny input$ID variables to dplyr function arguments如何将闪亮的 input$ID 变量传递给 dplyr 函数参数
【发布时间】:2017-06-05 04:32:28
【问题描述】:

我正在尝试创建一个简单的应用程序,该应用程序通过因子水平绘制连续变量的平均值。 用户选择几个因素之一进行分组,并选择连续变量进行平均。该应用程序应该使用 ggplot 显示绘图。很容易让这个功能在闪亮之外工作,但我正在努力让它在应用程序中工作。 我知道问题在于我对 NSE 和 SE 缺乏了解,但是在查看了几个小时的文档并测试了各种版本之后,这是我能想到的最好的方法。这似乎是一个常见问题,但我没有看到与堆栈溢出问题相关的答案。

我以泰坦尼克号数据集为例 我得到以下信息:

mean.default(input$ContVar) 中的警告:参数不是数字或 逻辑:返回 NA 除了误差之外,绘制绘图时均值不会发生变化。

    library(shiny)
    library(dplyr)
    library(ggplot2)
    Titan <- as.data.frame(Titanic)
    Titan <- mutate(Titan, Freq2 = Freq +3)

    shinyApp( ui = basicPage( selectInput("FactVar", "Factor", choices = names(Titan)[1:4]), selectInput("ContVar", "Cont Variable", choices = names(Titan)[5:6]), plotOutput("surv")), server = function(input, output) {
        output$surv <- renderPlot({
            Titan %>%
            group_by_(~input$FactVar) %>%
            summarize_(MeanFreq = ~ mean(input$ContVar))%>%
            ggplot(aes_(x=~ MeanFreq, y = input$FactVar))+geom_point()
        })
    })

【问题讨论】:

  • 也许this 会有所帮助。
  • 从上面的链接我想出了这个。 eval(substitute(Titan %&gt;% group_by_(~input$FactVar) %&gt;% summarize_(MeanFreq = ~ mean(col)), list(col = as.symbol(input$ContVar)))) %&gt;% ggplot(aes_(x=~ MeanFreq, y = input$FactVar))+geom_point()
  • 感谢 SBista 对问题的关注。当我运行代码时,上面的解决方案并没有解决问题。我会阅读上面的链接以获取线索。
  • 看起来使用 dplyr 0.6.0 版会更容易。看到这个答案:[链接](stackoverflow.com/questions/44398831/…

标签: r ggplot2 shiny dplyr


【解决方案1】:

这是我想出的一个快速的小解决方案。

这里的关键是使用 rlang 包中的 !! 运算符和 sym 函数。如果您有任何问题,请告诉我!

library(shiny)
library(dplyr)
library(ggplot2)
Titan <- as.data.frame(Titanic)
Titan <- mutate(Titan, Freq2 = Freq +3)

shinyApp( 
  ui = basicPage( 
         selectInput("FactVar", "Factor", 
                     choices = names(Titan)[1:4]), 
         selectInput("ContVar", "Cont Variable", 
                     choices = names(Titan)[5:6]), plotOutput("surv")), 

  server = function(input, output) {

output$surv <- renderPlot({
    Titan %>%
      group_by(!!rlang::sym(input$FactVar)) %>%
      summarize(MeanFreq = mean(!!rlang::sym(input$ContVar))) %>%
      ggplot(aes_string(x="MeanFreq", y = input$FactVar)) + geom_point()
  })
})

非标准评估绝对是 R 语言中比较棘手的方面之一。祝你好运!

【讨论】:

    【解决方案2】:

    这是一个选项,虽然它不使用 dplyr。

    我正在使用聚合并明确命名结果列,因此我以后可以在 ggplot 中调用这些名称。

    library(shiny)
    library(ggplot2)
    Titan <- as.data.frame(Titanic)
    Titan <- mutate(Titan, Freq2 = Freq +3)
    
    shinyApp( 
    
      ui = basicPage( 
        selectInput("FactVar", "Factor", choices = names(Titan)[1:4]), 
        selectInput("ContVar", "Cont Variable", choices = names(Titan)[5:6]), 
        plotOutput("surv")), 
    
      server = function(input, output) {
       output$surv <- renderPlot({
    
         MeanFreq <- aggregate(list(ContVar = Titan[, input$ContVar]), 
                               list(FactVar = Titan[, input$FactVar]), 
                               mean)
    
          ggplot(MeanFreq, aes(x = ContVar, y = FactVar)) +
            geom_point()
      })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多