如果用户写入超过 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,但我遇到了同样的问题。
提前致谢
问候
【问题讨论】:
您的代码非常适合我。如果我输入mpg
和cyl
,然后输入Enter
,我会得到只有这两列的mtcars 表。
@Julian_Hn 我不明白。如果我选择一列并单击更新按钮,我只能获取包含选定列的表。你做了什么?
完全一样。我输入了mpg
和cyl
,然后单击更新按钮(或回车)。表格会立即为我更新
@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 的数据框中选择列?的主要内容,如果未能解决你的问题,请参考以下文章
Shiny and rhandsontable - 基于列总和的条件单元格/列格式
如何在 R Shiny 中对使用反应数据框呈现的数据表执行计算?