【问题标题】:Shiny R renderPrint in loop usinf RenderUI only update the outputShiny R renderPrint in loop usinf RenderUI 仅更新输出
【发布时间】:2015-12-19 12:33:51
【问题描述】:

我正在尝试从多个文本输入动态呈现多个文本输出。我尝试使用this very helpfull examplethis one too。 这个conversation 也很有帮助。 但是,当我尝试在以下脚本上调整此示例时,我遇到了输出更新问题。显然,只有最后一个元素被读取和更新。这可能是一个反应性问题,但似乎很难将 reactive{()}renderUI{()}functions 关联起来。

rm(list = ls())
library(shiny)

creatDataElem <- function(ne, input) {
    x1 <- lapply(1:ne, function(i) {
    textInput(paste0("elemName", i),
          label = h4(strong("Name of dataset element")),
          value = "")
   })
   return(x1)
}

ui = (fluidPage(
         sidebarLayout(
           sidebarPanel(
             sliderInput("elemNb",
                         "Number of elements", value = 1, min = 1,
                         max = 3)
             ,
             conditionalPanel(
               condition = "input.elemNb == 1",
               creatDataElem(1)
             ),
             conditionalPanel(
               condition = "input.elemNb == 2",
               creatDataElem(2)
             ),
             conditionalPanel(
               condition = "input.elemNb == 3",
               creatDataElem(3)
             )
           ),
         mainPanel(
           uiOutput("nameElem")
         )
       )
      )
   )

server = function(input, output, session) {

max_elem <- 3
# Name

output$nameElem <-renderUI({
  nameElem_output_list <- lapply(1:input$elemNb, function(i) {
    elemName <- paste0("elemName", i)
    tags$div(class = "group-output",
             verbatimTextOutput(elemName)
    )
  })
  do.call(tagList, nameElem_output_list)
})

for (i in 1:max_elem) {
  local({
    force(i)
    my_i <- i
    elemName <- paste0("elemName", my_i)
    output[[elemName]] <- renderPrint(input[[elemName]])
  })
}
}

runApp(list(ui = ui, server = server))

reactive({}) 函数的想法是添加一个独立对象(在本例中为函数),例如:

nameElem <- reactive({
  if (input$goElem == 0) {
    return()
  } else {
    isolate({
      if (is.null(input$elemName)) {
         return()
      } else if (test(input$elemName)) {
         return("TEST RESULT")
      } else {
         return(input$elemName)
      }
   })
 }
})

并在此对象上使用renderUI(带有ActionButton)。 所以,如果有人知道为什么输出没有返回好的对象......

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我认为您的一个问题是您的 creatDataElem 函数在使用参数 ne=3 调用时,会再次创建第一个和第二个 textInput 元素(并且它们的值“丢失”)。

    无论如何,我认为一种解决方案是将这些 textInput 元素创建为“uiOutput”。

    您会找到一个可能的解决方案,在它下面(我认为)可以满足您的需求。

    丽丝

    rm(list = ls())
    library(shiny)
    
    ui = (fluidPage(
      sidebarLayout(
        sidebarPanel(
          sliderInput("elemNb",
                      "Number of elements", value = 1, min = 1,
                      max = 3),
          uiOutput("myUI")    
        ),
        mainPanel(
          uiOutput("nameElem")
        )
      )
    )
    )
    
    server = function(input, output, session) {
      output$myUI=renderUI({
        w=""
        for (i in 1:input$elemNb){
          w=paste0(w,
                   textInput(paste0("elemName",i),label='Name of dataset element'))
        }
        HTML(w)
      })
      output$nameElem <-renderUI({
        elems=c("<div>")
        for(i in 1:input$elemNb){
          elems=paste(elems,"</div><div>",input[[paste0("elemName",i)]])
        }
            elems=paste0(elems,"</div>")
            HTML(elems)
          })
    }
    
    runApp(list(ui = ui, server = server))
    

    【讨论】:

    • thx 这似乎是解决问题的好方法。我没有怀疑creatDataElem 函数。
    • 但在这里,HTML 似乎只适用于字符串(如 HTML 函数帮助的文本)。那么,是否可以对其他 R 对象执行相同的操作,例如 dataframevector
    【解决方案2】:

    找到解决办法:

    library(readr)
    library(dplyr)
    library(shiny)
    
    df <-  data.frame(symbol = 1:10)
    
    uiOutput("myUI")
    
    createUI <- function(dfID, symbol) {
        div(class="flex-box",paste0(symbol, " - 10"))
      }
    output$myUI <- renderUI({
    
        w <- lapply(seq_len(nrow(df)), function(i) {
          createUI(i, df[i,"symbol"])
        })
    
        do.call(fluidPage,w)
    })
    

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2015-01-19
      • 1970-01-01
      • 2020-09-29
      • 2018-10-16
      • 2018-09-30
      • 2015-10-12
      • 2015-04-15
      • 2020-05-01
      相关资源
      最近更新 更多