Shiny - 过滤用户输入变量

Posted

技术标签:

【中文标题】Shiny - 过滤用户输入变量【英文标题】:Shiny - filtering for user input variable 【发布时间】:2018-12-29 13:43:53 【问题描述】:

我只是想创建一个基本的闪亮应用程序,允许用户查看选定变量的简单图并根据需要应用过滤器。

但是,我很难让情节与应用的过滤器一起工作。如果我不应用过滤器,我可以让绘图工作,但当前代码给出错误:“错误:没有适用于 'filter_' 的方法应用于类“字符”的对象”。

我意识到问题与试图绘制的内容有关,可能与应用于“input$Variable”的过滤器有关,但我无法解决!任何帮助表示赞赏!

这是我的代码:

library(shiny)
data <- read.csv("df1Final.csv", stringsAsFactors = T)

ui <- fluidPage(
   titlePanel("PhD Data"),
   sidebarLayout(
      sidebarPanel(
        uiOutput("Variable"), 
        sliderInput("Age.Yr", "Age:", 8, 12, c(8,12), step = 0.25),
         sliderInput("Train.Hr", "Training (Hours):", 9, 11, c(9,11), step = 0.1),
         sliderInput("Grade", "Grade:", 3, 5, c(3,5), step = 1)
      ),
      mainPanel(plotOutput("coolplot"),
                br(), br(),
                verbatimTextOutput("results")
      )
   )
)

server <- function(input, output) 
  output$Variable <- renderUI(
    selectInput("Variable", "Data:", choices = colnames(data)[-1])
  )

  filtered <- reactive(
    if (is.null(input$Variable)) 
      return(NULL)
    
    input$Variable %>%
      filter(Age.Yr >= input$Age.Yr[1],
             Age.Yr <= input$Age.Yr[2],
             Train.Hr >= input$Train.Hr[1],
             Train.Hr <= input$Train.Hr[2],
             Grade >= input$Grade[1],
             Grade <= input$Grade[2] 
      )
  )

  output$coolplot <- renderPlot(
    if (is.null(filtered())) 
      return()
    

    ggplot(filtered(), aes(x=filtered(), color=Group)) +
      geom_density()
  )
  output$results <- renderPrint(
    describeBy(data[,input$Variable], data$Group, mat = F)
  )


# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

试试 as.numeric 像 as.numeric(input$Age.Yr[1]) 等等 【参考方案1】:

我认为问题在于您过滤的是 Shiny 传递给您的实际值,而不是您的数据。 Input$Variable 不是一组数据,它只是那一列数据的标题。

尝试在操作之前打印出 input$Variable。

【讨论】:

这是你的意思吗?我尝试这样做: plotdata 所以我发现 input$Variable 只是返回变量的名称,因此我遇到了问题。我必须有 data[input$Variable] 用于数据过滤。现在只是对 ggplot 的实际 aes 有问题!【参考方案2】:

所以我已经能够通过将过滤调整为:

data[input$Variable] %>% ...

然后我还必须将 ggplot 中的 aes 调整为:

aes_string(x=input$Variable)

目前仍在尝试解决如何将 color = Group 添加到 ggplot,因为这现在不起作用。

【讨论】:

以上是关于Shiny - 过滤用户输入变量的主要内容,如果未能解决你的问题,请参考以下文章

来自 Shiny 的 RODBC 多输入

R Shiny:如何动态附加任意数量的输入小部件

如何在 R Shiny 中使用变量名访问辅助输入?

将反应输入传递到 R Shiny 中的绘图轴

在R Shiny中,如何用observe替换observeEvent?

R Shiny:如何在嵌套模块之间传递反应变量