问题描述
我正在制作一个应用程序,用户可以使用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()
})
})