R - 使用 Purrr 包从 Tibble 创建多个闪亮的反应表达式



tldr:我想压缩多个反应式表达式(超过 300 行代码),以提高可读性和可维护性。

我通过遵循此线程及其依赖项进行了出色的升级。我的观察者被转换为由 FP 通过 purrr 包触发的观察事件(效率更高、更易于阅读),方法是使用扩展网格创建的 tibble 来获取我所有可能的输入(它们接近 120)。

现在的情况是,我想对我的响应式表达式做一些类似于我对观察者做的事情,我的一个问题是反应式表达式有相关的返回值,并且据我所知,通过迭代创建存储的可访问对象(在这种情况下矢量化)这通常不是一个好的做法。

接下来我将发布一个玩具示例,

library(shiny)
ui <- fluidPage(
numericInput(inputId = 'a', label = 'a', value = ''),
numericInput(inputId = 'b', label = 'b', value = ''),
conditionalPanel(condition = 'output.OK_1',
actionButton(inputId = 'ok_btn_1', label = 'OK_1')),

numericInput(inputId = 'c', label = 'c', value = ''),
numericInput(inputId = 'd', label = 'd', value = ''),
conditionalPanel(condition = 'output.OK_2',
actionButton(inputId = 'ok_btn_2', label = 'OK_2'))
)
server <- function(input, output, session) {

#' this are the reactives that I'd like to create by means of FP.
output$OK_1 <- reactive({req(input$a, input$b)
if (input$a > input$b) {return(1)} else{return(0)}
})
output$OK_2 <- reactive({req(input$c, input$d)
if (input$c > input$d) {return(1)} else{return(0)}
})

outputOptions(output, "OK_1", suspendWhenHidden = FALSE)
outputOptions(output, "OK_2", suspendWhenHidden = FALSE)
}
shinyApp(ui, server)

我想到并尝试了一个解决方案,通过创建一个 eventReactive 而不是 reactive,因为前者由后者提供支持,并使用 eventReactive 以及包含我所有输入的 tibble(就像我对 observeEvents 所做的那样)和 purrr::p walk(也许在这里我们有一个关键的误解,因为 pwalk 不是用于返回值,而是用于函数/公式的副作用。无论如何,我会让它作为 pwalk 直到收集更多信息)。这种方法不起作用(下一段代码中显示了一个例子),所以我可能使用了 purrr 中的错误函数,或者我可能过度杀伤了它,并且还有一种我还不知道的更好方法。

不成功的方法(UI 部分保持不变):

library(shiny)
library(tibble)
library(purrr)
# variables----
#' defined outside server function
vars <- tibble::tribble(
~x,  ~y,  ~OK,
#'---|----|------|
'a', 'b', 'OK_1',
'c', 'd', 'OK_2'
)
#' ui stays the same as before
#'ui <- fluidPage(
#'...
#')
server <- function(input, output, session) {
purrr::pwalk(vars,
####----
# 1.. x input 
# 2.. y input
# 3.. OK
####----
~{output[[..3]] <- eventReactive(
if (input[[..1]] > input[[..2]]) {return(1)} else{return(0)},
ignoreInit = TRUE, ignoreNULL = TRUE
)
}
)
outputOptions(output, "OK_1", suspendWhenHidden = FALSE)
outputOptions(output, "OK_2", suspendWhenHidden = FALSE)
}
shinyApp(ui, server)

欢迎任何意见或建议。

这对我有用(您示例中的所有对象):

library(purrr)
## ...
pwalk(vars, ~{
output[[..3]] <<- reactive({
req(input[[..1]], input[[..2]])
return(input[[..1]] > input[[..2]])
})
})
# ...

请注意,需要双左赋值<<-以解决在pwalk中运行的函数环境之外的output

最新更新