【问题标题】:R Shiny: How to create server-side functions that paste "input$" with function argument inputsR Shiny:如何创建使用函数参数输入粘贴“input$”的服务器端函数
【发布时间】:2021-09-09 14:43:19
【问题描述】:

我正在尝试创建一个函数来简化长响应式表达式。目标是根据用户输入创建一个数据框。该函数的目标是根据函数参数动态引用 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 等,但并没有让它发挥作用。任何帮助将不胜感激。

【问题讨论】:

    标签: r shiny shiny-server


    【解决方案1】:

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

    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 年 6 月 26 日创建

    【讨论】:

      猜你喜欢
      • 2016-02-21
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2018-05-19
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多