繁体   English   中英

循环R中的Shiny R renderPrint仅用于RenderUI更新输出

[英]Shiny R renderPrint in loop usinf RenderUI only update the output

我正在尝试从多个文本输入动态呈现多个文本输出。 我尝试使用这个非常有用的示例使用了这个示例 这个对话也很有帮助。 但是,当我尝试根据以下脚本修改此示例时,出现输出更新问题。 显然,只有最后一个元素被读取和更新。 这可能是一个问题的反应,但它似乎是难以关联reactive{()}renderUI{()}功能。

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 )。 因此,如果有人知道为什么输出不返回好对象...

我认为您的问题之一是您的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))

找到一个解决方案:

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)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM