【问题标题】:R Shiny - Using shinyjs::toggleState with shinyWidgets::pickerInputR Shiny - 使用 shinyjs::toggleState 和 shinyWidgets::pickerInput
【发布时间】:2019-08-18 18:38:50
【问题描述】:

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

  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) 返回:

[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 仅返回 [1] ""(不是

NULL
[1] ""

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

【问题讨论】:

    标签: r shiny shinyjs


    【解决方案1】:

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

    ?is.null

    NULL 表示 R 中的空对象:它是一个保留字。 NULL 通常由其值的表达式和函数返回 未定义。

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

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

    > isTruthy('')
    [1] FALSE
    

    【讨论】:

    • 非常感谢!我知道NULL 和"" 之间的区别,但isTruthy() 对我来说是新的。
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2020-05-02
    • 2019-02-12
    • 2019-07-09
    • 2019-06-26
    • 2021-01-27
    • 2018-11-09
    • 2021-11-13
    相关资源
    最近更新 更多