繁体   English   中英

r一个循环中闪亮的renderUI

[英]r shiny renderUI in a loop

我想输出几个表作为一个uiOutput。 如果我使用循环将它们放在一个列表中,那么所有输出都等于最后一个。 例:

library(shiny)

ui <- fluidPage(
  mainPanel(
    uiOutput("tables")
  )
)

server <- function(input, output) {
  output$tables <- renderUI({
    data=array(rnorm(150),c(10,5,3))

    tfc = function(m){
#      x = m[1,1]
      renderTable({m})
    }

    result=list()
    for(i in 1:3)
      result[[i]] = tfc(data[,,i])

    return(result)
  })
}

shinyApp(ui = ui, server = server)

如果我删除注释行(x = m [1,1]),我会得到所需的结果。

我可以忍受这种解决方法但是有一个原因可以解释为什么闪亮的表现或者有不同的方法来做到这一点?

我通常使用lapply这样的用例。 这样,您就不会遇到延迟评估的问题。

library(shiny)

ui <- fluidPage(
  mainPanel(
    uiOutput("tables")
  )
)

server <- function(input, output) {
  output$tables <- renderUI({
    data=array(rnorm(150),c(10,5,3))

    tfc = function(m){renderTable({m})}

    lapply(1:3, function(i){tfc(data[,,i])})
  })
}

shinyApp(ui = ui, server = server)

如果你想使用一个反应表,你可以使用类似的东西

tfc = function(m, output, id){
  output[[id]] <- renderTable({m()})
  tableOutput(id)
}

代替。

要解决这个问题,您可以force评估函数参数:

tfc = function(m) {
  force(m)
  renderTable(m)
}

要么

为每个循环迭代创建一个local范围:

for (i in 1:3) {
  local({
    i <- i
    result[[i]] <<- tfc(data[,,i])
  })
}

lapply适用,但仅适用于R版本3.2及以上版本: httpslapply

暂无
暂无

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

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