在Shiny Module中的renderUI()中使用lapply()

时间:2017-04-06 15:53:09

标签: r module shiny lapply

我正在尝试将一段代码转换为Shiny模块,但lapply()中生成的renderText()函数似乎不起作用。我在下面创建了一个简单的例子来演示这个问题。

(注意:我在这里使用library(shiny) ui <- fixedPage( h2("Normal example"), uiOutput("test") ) server <- function(input, output, session) { output$test <- renderUI({ lapply(1:3, function(val) { fluidRow(column(12,renderText(paste("Line", val)))) }) }) } shinyApp(ui, server) 次调用,但同样的行为适用。)

app_normal.R:

library(shiny)

myModuleUI <- function(id) {
  ns <- NS(id)
  uiOutput(ns("test"))
}

myModule <- function(input, output, session) {
  output$test <- renderUI({
    lapply(1:3, function(val) {
      fluidRow(column(12,renderText(paste("Line", val))))
    })
  })
}

ui <- fixedPage(
  h2("Module example"),
  myModuleUI("test_module")
)

server <- function(input, output, session) {
  callModule(myModule, "test_module")
}

shinyApp(ui, server)

app_module.R:

div

正在创建所有renderText()元素,但它们无法包含图表/文本。如何在模块中renderPlot() / renderUI()次调用中正确使用闪亮的lapply()String username = "", password = ""; username = ((EditText)findViewById(R.id.username_pet)).toString(); password = ((EditText)findViewById(R.id.password_pet)).toString(); 函数?

1 个答案:

答案 0 :(得分:1)

我在renderText()中直接使用renderPlot()renderUI()函数的方法似乎在正常情况下正常工作,即在不在闪亮模块中运行时。 Shiny会自动调用必要的textOutput()plotOutput()来生成HTML。在Shiny模块中执行相同操作时,如何破坏此自动链接。我怀疑这是由于output列表中分配和引用项目之间的不匹配,因为在分配ns()时引入了outputId,因为在outputPlot()调用时手动完成{1}}或outputText()

要在Shiny模块中成功使用renderUI,您需要在{{1}的textOutput()中单独呼叫renderText()textOutputlapply()renderUI()的{​​{1}}中{}}和renderText()。这样,我们就可以lapply()observe()调用ns()生成一个outputId

下面我已经对textOutput()app_normal.R进行了重构,以证明这两个电话的解开。

app_normal_observe.R:

app_module.R

app_module_observe.R:

library(shiny)

ui <- fixedPage(
  h2("Normal example"),
  uiOutput("test")
)

server <- function(input, output, session) {
  output$test <- renderUI({
    lapply(1:3, function(val) {
      fluidRow(column(12,textOutput(paste0("line_", val))))
    })
  })

  observe({
    lapply(1:3, function(val) {
      output[[paste0("line_", val)]] <- renderText(paste("Line", val))
    })
  })
}

shinyApp(ui, server)