如何 select 闪亮模块中输入 R6 class 的元素子集以对它们执行操作
How to select a subset of elements of the input R6 class within a shiny module to perform operations on them
我能否访问模块中所有输入小部件的列表(让我们将其命名为 myModule
)并检查它们的状态是否为 isTruthy()
。
我找到了一种在我知道(或可以推断出)小部件的确切名称时有效的方法(请参阅 )。
All_Inputs <- vapply(paste0('axis',1:3),
function(x) { isTruthy(input[[x]]) },
logical(1))
当然,我也可以用一长串if (isTruthy(input$a) && isTruthy(input$b) && ...
来完成。但是这两种解决方案都不让我满意,主要是因为在可读性和可维护性方面存在缺陷。
我知道 input
class 将它们都列在以 myModule-[AnyName]
开头的名称下。但我不知道如何使用该信息通过循环或更好的 apply
函数来访问它们。
由于 input
是命名列表,您可以在 names(input)
上使用 vapply
:
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)
我能否访问模块中所有输入小部件的列表(让我们将其命名为 myModule
)并检查它们的状态是否为 isTruthy()
。
我找到了一种在我知道(或可以推断出)小部件的确切名称时有效的方法(请参阅
All_Inputs <- vapply(paste0('axis',1:3),
function(x) { isTruthy(input[[x]]) },
logical(1))
当然,我也可以用一长串if (isTruthy(input$a) && isTruthy(input$b) && ...
来完成。但是这两种解决方案都不让我满意,主要是因为在可读性和可维护性方面存在缺陷。
我知道 input
class 将它们都列在以 myModule-[AnyName]
开头的名称下。但我不知道如何使用该信息通过循环或更好的 apply
函数来访问它们。
由于 input
是命名列表,您可以在 names(input)
上使用 vapply
:
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)