微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将varSelectInput传递给ggplot2 R Shiny

如何解决如何将varSelectInput传递给ggplot2 R Shiny

我正在制作一个应用程序,用户可以使用varSelectInput从数据帧名称列表中选择x和y轴以及所需的facet变量。我已经尝试过许多在stackOverflow上看到过的建议方式,但在我的情况下,这些方法都无法正常工作。这是带有每个变量的inputId的renderUI代码

    output$descrxaxis_Variable <- renderUI({
      varSelectInput(inputId = "descrxaxis",label = "Choose x axis variable",data = descrDataMelted_selVars$df)})
    
    output$descryaxis_Variable <- renderUI({
      varSelectInput(inputId = "descryaxis",label = "Choose y axis variable(s)",data = descrDataMelted_selVars$df,multiple = TRUE,selectize = TRUE)})
    
    output$descrFacet_Variable <- renderUI({
      varSelectInput(inputId = "descrfacet",label = "Choose facet variable(s)",selectize = TRUE)})

我的代码当前看起来像这样,遵循此处的示例:https://shiny.rstudio.com/reference/shiny/latest/varSelectInput.html。我收到一条错误消息,告诉我输入内容不能是此代码的列表。输入的$ descrxaxis包含列名,例如“ day”,“ hour”,“ month”,“ TA”,“ PP”等。

    observeEvent(input$descrBtnPlot,{
      p <- ggplot(descrDataMelted_selVars$df,aes(!!input$descrxaxis,!!input$descryaxis))
      
      output$descrSummaryStatsPlot <- renderPlot(p)
    })

否则,我尝试使用.data [[column]]表示法和!!! rlang :: syms(column)表示法。任何帮助将不胜感激。

解决方法

问题在于ggplots aes()首先使用x和y参数,然后是...。第一个问题是,当varSelectInput允许选择multiple时,它将返回一个需要拼接成aes()的名称列表。但是,拼接!!!仅在使用点(see here)时有效。您可以使用输入之一将x和y之后的参数拼接到...中,但是在这种情况下,必须命名自变量才能生效,只是在x和y之后拼接变量名不会改变您的图。请尝试下面的示例,并使用上面链接的答案中提供的解决方法(aes2())。如您所见,只有前两个变量(x和y)会影响绘图。

library(shiny)
library(dplyr)
library(ggplot2)

aes2 <- function(...) {
  eval(expr(aes(!!!enquos(...))))
}

shinyApp(ui = fluidPage(
  
  sidebarLayout(
    sidebarPanel(
      
      varSelectInput('variables','Choose variables',mtcars,selected = c("mpg","cyl"),multiple = TRUE)
      
    ),mainPanel(
      plotOutput("graph")
    )
  )
),server = function(input,output) {
  
  output$graph <- renderPlot({
  
    mtcars %>% 
      ggplot(aes2(!!! input$variables)) +
      geom_point()
    
  })

})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。