使用 assign() 的 R Shiny 循环 renderUI 输入不起作用;硬编码确实

R Shiny looping renderUI inputs using assign() does not work; hard-coding does

我试图避免硬编码来打印 10 个文本输入的输入。

基本上,用户输入的关键字会生成适当的 SQL 代码作为文本。

SERVER.R

代码块 1:

所以第一个代码块是创建十个文本输入——这些是使用 renderUI 创建并使用 uiOutput

输出
 output$key1A_depend1 <- renderUI({
      lapply(1:5, function(i){
        textInput(paste0("key1_temp_",i),label=paste0(i),paste0(""))
      })#END lapply 
    })#END renderUI

    output$key1A_depend2 <- renderUI({
      lapply(6:10, function(i){
        textInput(paste0("key1_temp_",i),label=paste0(i),paste0(""))
      })#END lapply
    })#END renderUI

    # THE ABOVE WORKS FINE

代码块 2:

第二个代码块然后根据在文本输入中输入的内容分配基于文本的输出。如果在文本输入中没有输入任何内容,则这些符合“”或无文本。

output$key1A_main <- output$key1A_maincopy <- output$key1A_maincopy2 <- renderUI({ 

  for (i in 1:10){

    xy <- eval(parse(text=paste0("input$key_temp_",i)))

    assign(paste0("key1A_out_",i), 
           if(!is.null(xy)) {
             paste0("Details like '%",xy,"%' or ",br())
           }  
           else paste0(" ")
    )

  }#END for

# HARD CODING THE ABOVE INTO 10 SEPARATE STATEMENTS ALSO WORKS, JUST NOT IN THE FOR LOOP

代码块 3:

第三个代码块正在生成实际输出,整理在第二个代码块中生成的所有输出。

HTML(paste0(  key1A_start
                key1A_out_1
                , key1A_out_2
                , key1A_out_3
                , key1A_out_4
                , key1A_out_5
                , key1A_out_6
                , key1A_out_7
                , key1A_out_8
                , key1A_out_9
                , key1A_out_10)) 

})#END renderUI`enter code here`

# THE OUTPUT GENERATED RETURNS BLANKS for Kkey1A_out_1, 2, 3 …. , 10.

然而,当我对代码块 2 的值进行硬编码时,它工作得很好

备用代码块 2:

key1A_out_1 <- 
if(nchar(input$key1_temp_1)>0) 
    {paste0("Details like '%",input$key1_temp_1,"%' OR ",br())  } 
else 
{paste0(" ") }

# REPEATED 10 times

如有任何帮助,我们将不胜感激,这可能是范围界定问题,也可能是 assign() 未正确执行的问题。

这看起来像是变量命名错误的简单错误。 "key" 在

中应该是 "key1"
xy <- eval(parse(text=paste0("input$key1_temp_",i)))

但是,您可以简化代码块 2 和 3,并使用

摆脱 assigneval(parse 业务(两者都应避免)
output$key1A_main <- output$key1A_maincopy <- output$key1A_maincopy2 <- renderUI({
    HTML(
        lapply(1:10, function(i) {
            xy <- input[[sprintf("key1_temp_%d", i)]]
            if (!is.null(xy)) paste0("Details like '%", xy, "%' or ", br())
            else " "
        })
    )
})