使用 purrr::pwalk 从 tibble 创建多个闪亮的 observeEvents

Posted

技术标签:

【中文标题】使用 purrr::pwalk 从 tibble 创建多个闪亮的 observeEvents【英文标题】:use purrr::pwalk to create multiple shiny observeEvents from tibble 【发布时间】:2021-10-29 16:32:18 【问题描述】:

我想做什么

我想遍历一个小标题并创建多个观察事件。我在下面有一个可重现的例子。注释掉的代码可以工作,但我想用 pwalk 以编程方式创建 observeEvents。

基本上我正在尝试完成与这篇文章类似的事情:using purrr::walk to instate multiple event observers。 (虽然目标不同。我的目标是在一个 selectInput 更改时跨选项卡更新 selectInputs。)

代表

library(shiny)
library(purrr)
library(tibble)

choices1 <- c('A', 'B', 'C', 'D')
choices2 <- c('E', 'F', 'G', 'H')

dat_inputs <- tribble(
  ~ observe_input, ~ input_id,
  'tab11',         'tab21',
  'tab11',         'tab31',
  'tab21',         'tab11',
  'tab21',         'tab31',
  'tab31',         'tab11',
  'tab31',         'tab21'
  
)

ui <- navbarPage(
  title = 'Test Navbar Page',
  tabPanel(
    title = 'Tab 1',
    selectInput('tab11', 'Tab 11', choices = choices1
    ),
    selectInput('tab12', 'Tab 12', choices = choices2
    )
    ),
  tabPanel(
    title = 'Tab 2',
    selectInput('tab21', 'Tab 22', choices = choices1
    ),
    selectInput('tab12', 'Tab 12', choices = choices2
    )
    ),
  tabPanel(
    title = 'Tab 3',
    selectInput('tab31', 'Tab 31', choices = choices1
    ),
    selectInput('tab32', 'Tab 32', choices = choices2
    )
    )
)

server <- function(input, output, session) 
  
  # observeEvent(input$tab11, 
  #   updateSelectInput(inputId = 'tab21', selected = input$tab11)
  #   updateSelectInput(inputId = 'tab31', selected = input$tab11)
  # )
  # 
  # observeEvent(input$tab21, 
  #   updateSelectInput(inputId = 'tab11', selected = input$tab21)
  #   updateSelectInput(inputId = 'tab31', selected = input$tab21)
  # )
  # 
  # observeEvent(input$tab31, 
  #   updateSelectInput(inputId = 'tab11', selected = input$tab31)
  #   updateSelectInput(inputId = 'tab21', selected = input$tab31)
  # )
  
# edit - commenting out the old code so that the solution takes its place
  
  # this code does not work
  # if you delete handler.quoted = TRUE the shiny app runs but the
  # observeEvents don't work
  
  # pwalk(
#   dat_inputs,
#   ~ observeEvent(
#     input[[.x]],
#     updateSelectInput(inputId = input[[.y]], selected = input[[.x]]),
#     handler.quoted = TRUE
#   )
# )

################################
# solution from accepted answer:
################################
pwalk(
    dat_inputs,
    ~ observeEvent(
        input[[.x]],
        updateSelectInput(inputId = .y, selected = input[[.x]],
                          session = session)
        )
  ) 
  


shinyApp(ui, server)

【问题讨论】:

【参考方案1】:

嗯,三件事,你正在使用input=input[[.y]] 而不仅仅是input=.y;当您使用这样的表达式时,它实际上没有被引用;你需要传递session=。试试

pwalk(
    dat_inputs,
    ~ observeEvent(
      input[[.x]],
      updateSelectInput(inputId = .y, selected = input[[.x]], session=session)
    )
  )

【讨论】:

谢谢!你的解决方案奏效了。我显然没有意识到我正在尝试使用 input[[.y]] 而不是 .y 哈哈。我对 session=session 部分很好奇。该代码似乎可以使用和不使用该部分。那为什么要加呢?再次感谢。 我仍在使用shiny 1.5,其中需要session=shiny 1.6 似乎不再需要它

以上是关于使用 purrr::pwalk 从 tibble 创建多个闪亮的 observeEvents的主要内容,如果未能解决你的问题,请参考以下文章

禁用 tibble 打印的支柱格式

Tidymodels:在 R 中进行 10 倍交叉验证后,从 TIbble 中取消最佳拟合模型的 RMSE 和 RSQ 值

生成 Tibble / DataFrame 代码

从 sparlyr tibble 对象读取数据时访问列时出错

将 bigquery JSON 数据转储加载到 R tibble

按嵌套 tibble 中作为字符串向量给出的变量对 tibble 进行分组