R Shiny - 使用 shinyjs::toggleState 和 shinyWidgets::pickerInput

R Shiny - Using shinyjs::toggleState with shinyWidgets::pickerInput

下面的应用程序包含一个标记为 Options 的单选按钮组和一个渲染的 renderUI 表达式:

  1. 一个输入元素 input$data 取决于 选定的按钮和
  2. 一个动作按钮input$add

我想在用户为 input$data 选择有效值之前禁用该按钮。我并列 observe({ toggleState(id = 'add', condition = !is.null(input$data)) }) 但这失败了。将 input$data 的值打印到控制台表明 pickerInput 初始化为两个单独的值 NULL"":

NULL
[1] ""

等等 !is.null(input$data) returns:

[1] FALSE
[1] TRUE

而不仅仅是 FALSE

应用程序:

library(shiny)
library(shinyjs)
library(shinyWidgets)


ui <- fluidPage(shinyjs::useShinyjs(),

                prettyRadioButtons('opt', label = 'Options', choices = c('state', 'file', 'letters')),

                uiOutput('upload')

)

server <- shinyServer(function(input, output, session) {

  output$upload = renderUI({

    tagList(
      switch(input$opt, 
           'state' = pickerInput('data', 'Choose a state', 
                                 choices = state.name, 
                                 options = list(title = "States..."),
                                 choicesOpt = list(subtext = seq_along(state.name))
                                 ), 

           'file' = fileInput('data', 'Select file'), 

           'letters' = pickerInput('data', 'Choose a letter', 
                                   choices = LETTERS, 
                                   options = list(title = "Letters..."),
                                   choicesOpt = list(subtext = seq_along(LETTERS))
                                   )
           ), 

      actionButton('add', 'Add')

      )

  })

  observe({

    print(input$data) # pickerInput initializes with two values
    toggleState(id = 'add', condition = !is.null(input$data))

  })


})

shinyApp(ui, server)

此外,当您将单选按钮从默认选择 state 切换到 file 然后再切换回 state 时,pickerInput returns 只是 [1] ""(不是

NULL
[1] ""

启动时 returns)。我不确定这里发生了什么,我在 pickerInput 的文档中找不到与此相关的任何内容,因此我们将不胜感激。

空字符串 '' 不是 R 中的空对象

?is.null

NULL represents the null object in R: it is a reserved word. NULL is often returned by expressions and functions whose values are undefined.

> !is.null('')
[1] TRUE

不过 shiny::isTruthy 会解决这个问题

> isTruthy('')
[1] FALSE