2

我可以访问一个模块中所有输入小部件的列表(让我们命名它myModule)并检查它们的状态是否为isTruthy().

当我知道(或可以推断)小部件的确切名称时,我找到了一种有效的方法(参见1)。

All_Inputs <- vapply(paste0('axis',1:3),
                     function(x) { isTruthy(input[[x]]) },
                     logical(1))

当然,我也可以用一长串if (isTruthy(input$a) && isTruthy(input$b) && .... 但这两种解决方案对我来说都不满意,主要是因为可读性和可维护性方面的缺陷。

我知道input该类将它们全部列在以 . 开头的名称下myModule-[AnyName]。但我不知道如何使用这些信息通过循环甚至更好的apply函数来访问它们。

4

1 回答 1

1

作为input命名列表,您可以使用vapplyon names(input)

library(shiny)

counterButton <- function(id, label = "Counter") {
  ns <- NS(id)
  tagList(
    actionButton(ns("button"), label = label),
    verbatimTextOutput(ns("out"))
  )
}

counterServer <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      count <- reactiveVal(0)
      observeEvent(input$button, {
        count(count() + 1)
      })
      output$out <- renderText({
        count()
      })
      count
    }
  )
}

ui <- fluidPage(
  counterButton("counter1", "Counter #1"),
  counterButton("counter2", "Counter #2"),
  textOutput('istruthy')
)

server <- function(input, output, session) {
  counterServer("counter1")
  counterServer("counter2")
  output$istruthy <- renderText({ 
    vapply(names(input), 
           function(x) { 
               ifelse(startsWith(x, "counter2-"), isTruthy(input[[x]]), TRUE) 
           },
           logical(1)) 
  })
 
}

shinyApp(ui, server)

在此处输入图像描述

于 2021-02-05T19:54:16.580 回答