【问题标题】:Ignore empty textInput in R Shiny忽略 R Shiny 中的空文本输入
【发布时间】:2020-05-20 05:12:48
【问题描述】:

我对 Shiny 还很陌生。在下面的应用程序中,如果两个 textInput 框中只有一个被填充,我希望能够呈现数据表。如果两个框都被填充,应用程序工作正常。但我希望数据表只如果只填写一个变量,则渲染一个变量(例如只输入X变量名,表格中只显示X变量数据)。

library(shiny)
library(dplyr)
library(DT)
data("mtcars")

ui <- fluidPage(
  titlePanel("Example 01"),

  sidebarLayout(

    sidebarPanel(

      textInput("x", "X Variable"),
      textInput("y", "Y Variable")
    ),

    mainPanel(

      dataTableOutput(outputId = "table")

    )
  )
)

server <- function(input, output) {

  tabledata <- reactive({
    x <- mtcars %>% select(input$x) * 2
    y <- mtcars %>% select(input$y) * 3

    if (is.null(x) == TRUE){y}
    if (is.null(y) == TRUE){x}
    else {cbind(x,y)}

  })

  output$table <- renderDataTable(tabledata())

}

shinyApp(ui = ui, server = server)

为了测试,我输入了 mpg 作为 X 变量,输入 cyl 作为 Y 变量。如果您想知道为什么我使用 textInput 而不是 selectInput,那是因为我使用它的项目有 100,000 多个搜索选项(音乐艺术家)。

提前致谢!

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    它不起作用,因为如果其中一个输入为空,则它并不是真正的空,而是character(0)"",如果您愿意的话。因此,R 尝试选择一个名为 "" 的列,但失败了。

    然后,您必须排除要显示的列列表的空字符串""

    我稍微简化了您的代码并添加了一个“触发”按钮来显示表格。 (这样,您可以等待输入C - Y - L 来显示数据。否则,代码会尝试在每个输入的字符处对数据帧进行子集化)。

    library(shiny)
    library(dplyr)
    library(DT)
    data("mtcars")
    
    ui <- fluidPage(
      titlePanel("Example 01"),
    
      sidebarLayout(
    
        sidebarPanel(
    
          textInput("x", "X Variable"),
          textInput("y", "Y Variable"), 
          actionButton("print", "print table")
        ),
    
        mainPanel(
    
          dataTableOutput(outputId = "table")
    
        )
      )
    )
    
    
    server <- function(input, output) {
    
      tabledata <- eventReactive(input$print, {
    
        x <- mtcars %>% select(if(input$x == "") NULL else {input$x}) * 2 # I don't use if_else because it has side effects to return a NULL value
        y <- mtcars %>% select(if(input$y == "") NULL else {input$y}) * 3
    
        if (ncol(x) == 0){y}
        if (ncol(y) == 0){x}
        else {cbind(x,y)}
    
      })
    
      output$table <- renderDataTable(tabledata())
    
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 感谢您简化代码,但不幸的是,在我的项目中,输入无法轻松组合成向量;他们首先被修改。为了反映这个例子,我回到原始代码并将mtcars %&gt;% select(input$x) 更改为mtcars %&gt;% select(input$x) * 2 并乘以3 得到y。很抱歉在最初的帖子中没有明确说明这一点。如果修改了输入并且您必须将 xy 保留为存储值,您将如何处理?
    • 好的,然后我对我的答案进行了编辑以坚持你的语法。不过,哲学保持不变。出于商品原因,我保留了触发按钮,但您当然可以摆脱它!
    【解决方案2】:

    而不是检查 x 是否为空白(正如@Jrm_FRL 指出的那样,input$x=='' 可以实现这一点,您可以回避这一点,只检查 x 是否是实际列的名称:

    x <- if(input$x %in% colnames(mtcars))  mtcars %>% select(input$x) * 2
    

    y 执行相同操作,其余代码应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2014-12-06
      • 2020-11-24
      • 2018-03-05
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多