R Shiny:如何创建使用函数参数输入粘贴 "input$" 的服务器端函数

R Shiny: How to create server-side functions that paste "input$" with function argument inputs

我正在尝试创建一个函数来简化一个长反应式表达式。目标是根据用户输入创建数据框。该函数的目标是根据函数参数动态引用 UI 中的不同输入。该函数有一个“day”参数,应该用 input$A 粘贴以创建 input$A<day>,其中 <day> 是我的服务器端函数的输入。在下面的示例中,我将 运行 foo(day = 1) 在我的主服务器功能中,这将根据用户在我的应用程序“第 1 天”中输入的输入创建一个数据框。

非常天真开始于:

foo <- function(day) {
     df <- data.frame(
         "A"     = paste0("input$A", day),
         "B"     = paste0("input$B", day)
     )
}

我知道这行不通,只是创建了一个数据框,其中包含多行文本“input$Aday”和“input$Bday”。从那以后,我一直在探索使用 eval(parse())rlang 等,但没有成功。任何帮助将不胜感激。

这里有两种将输入引用为对象的方法:

library(tidyverse)
library(shiny)

ui <- fluidPage(
  textInput('A1', 'InputA1', value = 'hello'),
  textInput('B1', 'InputB1', value = 'How are you?')
)

server <- function(input, output, session) {
  
    foo1 <- function(day) {
        df <- data.frame(
            "A"     = input[[str_c('A', day)]],
            "B"     = input[[str_c("B", day)]]
        )
    }
    
    foo2 <- function(day) {
        df <- tibble(
            "A"     = parse(text =str_c('input$A', day)) %>% eval(),
            "B"     = parse(text =str_c('input$B', day)) %>% eval()
        )
    }
    
    observe({
        print(foo1(day = 1))
        print(foo2(day = 1))})
    
    
}

shinyApp(ui, server)
#> 
#> Listening on http://127.0.0.1:6240
#>       A            B
#> 1 hello How are you?
#> # A tibble: 1 x 2
#>   A     B           
#>   <chr> <chr>       
#> 1 hello How are you?

reprex package (v2.0.0)

于 2021-06-26 创建