如果用户写入超过 1 列,如何从 Shiny 的数据框中选择列?

Posted

技术标签:

【中文标题】如果用户写入超过 1 列,如何从 Shiny 的数据框中选择列?【英文标题】:How to select columns from a dataframe in Shiny if the user writes more than 1 column? 【发布时间】:2021-08-21 16:17:36 【问题描述】:

我正在尝试创建一个应用程序,您可以在其中选择要查看的列。

这篇文章对我帮助很大:Shiny How to dynamically select columns of imported dataset for further analysis

但是,如果用户不点击选项并写入想要查看的列,我希望能够选择列。

现在,为了能够选择列,您需要单击或写入一列。

但是,当您尝试编写超过 1 列时(例如:“cyl mpg hp”,在同一行中),它​​不会出现任何内容。

这是代码:

ui <- fluidPage(
    
    # Application title
    titlePanel("Old Faithful Geyser Data"),
    
    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            selectInput("select", "Select columns to display", c('col1,col2'), multiple = TRUE),
            actionButton("update", "Update Data set", class = "btn-primary",style='padding:4px; font-size:120%')
        ),
        
        # Show a plot of the generated distribution
        mainPanel(
            h2('The Mydata'),
            #tableOutput("mytable")
            DT::dataTableOutput("mytable")
            
        )
    )
)

library(shiny)
library(DT)

server <- function(session, input, output) 
    
    data <- reactive(
       mtcars
    )
    
    filtereddata <- eventReactive(
        input$update
        data()
    ,  
        req(data())
        if(is.null(input$select) || input$select == "")
            data() else 
                data()[, colnames(data()) %in% input$select]
    )
    
    observeEvent(data(), 
        updateSelectInput(session, "select", choices=colnames(data()))
    )
    
    output$mytable  <- renderDataTable(filtereddata())
    
 

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

我尝试过另一种方式,比如这里:https://shiny.rstudio.com/reference/shiny/1.6.0/varSelectInput.html,但我遇到了同样的问题。

提前致谢

问候

【问题讨论】:

您的代码非常适合我。如果我输入mpgcyl,然后输入Enter,我会得到只有这两列的mtcars 表。 @Julian_Hn 我不明白。如果我选择一列并单击更新按钮,我只能获取包含选定列的表。你做了什么? 完全一样。我输入了mpgcyl,然后单击更新按钮(或回车)。表格会立即为我更新 @Julian_Hn 但是您是否在同一行同时写了这些列?因为如果我输入 mpg 然后输入 cyl,表格会完美更新。我的问题是,当您尝试像这样在搜索按钮“mpg cyl”中写入时,表格不会更新。这就是我想要解决的问题。 啊...对不起,我误解了你的问题,我会看看我能做什么 【参考方案1】:

我有一种方法可以选择 n 列,其中一个字符串包含一个空格(如果有错别字,则更多),但它需要一个 textInput。 SelectInput 不允许我输入字符串。

如果只输入一列会显示错误,但可以用 if 语句修改。

示例代码:

library(stringr)
library(shiny)
library(tidyverse)
library(rebus)

ui <- fluidPage(
    
    # Application title
    titlePanel("Old Faithful Geyser Data"),
    
    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            textInput('select_text', 'Type a column', placeholder = 'enter col names between spaces'),
            actionButton("update", "Update Data set", class = "btn-primary",style='padding:4px; font-size:120%')
        ),
        
        # Show a plot of the generated distribution
        mainPanel(
            h2('The Mydata'),
            #tableOutput("mytable")
            DT::dataTableOutput("mytable")
            
        )
    )
)

library(shiny)
library(DT)

server <- function(session, input, output) 
    
    data <- reactive(
        mtcars
    )
    
    filtereddata <- eventReactive(
        input$update,  
        
            cols_spaces <- str_split(input$select_text, rebus::one_or_more(rebus::SPACE),simplify = TRUE) #format the names to a vector
                data()[, colnames(data()) %in% cols_spaces] #now they can be used to subset data()
                
        
                    
    )
    
    observeEvent(data(), 
        updateSelectInput(session, "select", choices=colnames(data()))
    )
    
    output$mytable  <- renderDataTable(filtereddata())
    
 

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

【讨论】:

以上是关于如果用户写入超过 1 列,如何从 Shiny 的数据框中选择列?的主要内容,如果未能解决你的问题,请参考以下文章

根据用户的输入创建列联表 - R Shiny

Shiny and rhandsontable - 基于列总和的条件单元格/列格式

如何从 R Shiny 的选择菜单中拆分选定的列?

如何在 R Shiny 中对使用反应数据框呈现的数据表执行计算?

是否可以在 Shiny 中将 eventReactive 用于超过 1 个 checkboxInput?

由于用户选择,当列改变位置时,在Shiny中取消选择DT :: formatRound中的列