如何通过闪亮的 selectInput 动态选择数据帧的子集?

Posted

技术标签:

【中文标题】如何通过闪亮的 selectInput 动态选择数据帧的子集?【英文标题】:How to dynamically select a subset of a dataframe via selectInput in shiny? 【发布时间】:2018-10-07 04:18:41 【问题描述】:

我想创建一个简单的闪亮应用程序。在应用程序中我上传了一个 csv 文件。这里我使用的 csv 文件是 mtcars.csv。然后有两个selectInputs。我用上传的 csv 文件的列填充第一个。第二个由第一个 selectInput 中已选择的字段的所有值填充。直到这里一切都很好。当我单击 actionButton 时问题就开始了:我想渲染表上传的 csv 的所有记录,其中第一个 selectInput 等于第二个。例如,如果 csv 文件是 mtcars,第一个 selectInput 是圆柱体,第二个是 6,我想渲染表所有有 6 个圆柱体的汽车。

但是,结果始终为空。这是我的 UI 的代码:

ui <- fluidPage(

   # Application title
   titlePanel("This is a test!"),


   sidebarLayout(
      sidebarPanel(
         fileInput("file", "Browse",
                   accept = c("text/csv",
                              "text/comma-separated-values,text/plain",
                              ".csv")
                   ),

         selectInput("first","Variable Name", choices = NULL),
         selectInput("second","Ranges", choices = NULL),
         actionButton("btn","Proceed")
      ),


      mainPanel(
         tableOutput("out")
      )
   )
)

这是我的服务器:

server <- function(input, output, session) 

   #storing the csv in df
   df = reactive(
      req(input$file)
      return(read_csv(input$file$datapath))
   )

   #populating first inputSelect
   observe(
      choices1 = colnames(df())
      updateSelectInput(session,"first", choices =  choices1)
   )

   #populating second inputSelect
   observeEvent(input$first,
      choices1 = df() %>%
         select(input$first) %>%
         unique()

      updateSelectInput(session,"second", choices =  choices1)
   )

   #The goal is to return all rows in df() where the values
   #of column in first selectInput is equal to second selectInput
   observeEvent(input$btn,
      x = df() %>%
         filter(input$first == input$second) #problem: this is always empty

      output$out = renderTable(x)
   )

我是闪亮的新手。我正在寻找正确的方法来做到这一点。 这是空输出的快照:

【问题讨论】:

【参考方案1】:

我相信这应该可行

observeEvent(input$btn,
      x = df()[df()[,input$first] == input$second,]
      output$out = renderTable(x)
   )

问题是你正在这样做

filter("cyl" == 6) 

你需要这样做

filter(cyl == 6)

这是因为input$first = "cyl" 是一个字符串。因此,您的代码将字符串与数字进行比较,这在过滤器上给出了零行。

【讨论】:

如果你设置为使用dplyr::filter,你也可以这样做:filter(!! rlang::sym(input$first) == input$second) 谢谢你们。 @Aurèle,现在我在 ggplot2 中面临另一个类似的问题。我可以传递您在aes 中指定的参数。但是,当我想在 facet_grid 中执行类似操作时收到错误消息。例如facet_grid(~(!!rlang::sym(var2)))facet_grid(~!!rlang::sym(var2)) 会抛出错误。我也不明白为什么我们需要使用!!sym?。任何帮助表示赞赏。 @wastepaper 你应该把它变成一个新问题(标记为rlang)。您可以查找“准引用”,它现在已完全融入dplyr,但仍未完全融入ggplot2,这可能是您的问题的原因...哦,等等,实际上:您尝试过更简单的:@987654335 @(没有波浪号 ~)? @Aurèle 我找到了一种方法:facet_wrap(as.formula(paste("~", var2 ))) @wastepaper 感谢分享!

以上是关于如何通过闪亮的 selectInput 动态选择数据帧的子集?的主要内容,如果未能解决你的问题,请参考以下文章

RStudio闪亮动态选择

如何将我的 selectInput 链接到我的 DataTable 以根据选择更新表? (这是R闪亮)

闪亮的 selectInput 'Select All' 层次结构

在闪亮的 R 中使用 selectInput 来选择和过滤行,而不是选择列

R闪亮:当multiple = TRUE时selectInput()不反映变量选择

并非所有给定的 selectInput 选项都以闪亮的 R 显示