gpt4 book ai didi

r - 在 Shiny 模块的 renderUI() 中使用 lapply()

转载 作者:行者123 更新时间:2023-12-04 21:34:02 24 4
gpt4 key购买 nike

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

(注意:这里我使用 renderText() 调用,但同样的行为也适用。)

app_normal.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,renderText(paste("Line", val))))
})
})
}

shinyApp(ui, server)

app_module.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)

所有 div正在创建元素,但它们只是未能包含绘图/文本。如何正确使用 Shiny renderText()renderPlot() renderUI() 中的函数/ lapply()在模块内调用?

最佳答案

看来我正在使用 renderText() 的方法和 renderPlot()直接在 renderUI() 中运行在正常情况下工作正常,即不在 Shiny 模块中运行时。 Shiny 自动调用必要的textOutput()plotOutput()生成 HTML。当您在 Shiny 的模块中执行相同的操作时,这个自动链接是如何被破坏的。我怀疑这是由于 output 中分配和引用项目之间的不匹配。列表由于 ns() 的引入分配时调用outputId s 在调用 outputPlot() 时手动完成或 outputText() .

成功使用renderUI在 Shiny 模块中,您需要单独调用 textOutput()renderText() : textOutputlapply()renderUI() , 和 renderText()lapply()observe() .这允许我们引入 ns()进入一代outputId对于textOutput()称呼。

下面我包含了两个 app_normal.R 的重构。和 app_module.R这证明了这两个电话的分离。

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

app_module_observe.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,textOutput(session$ns(paste0("line_", val)))))
})
})

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

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

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

shinyApp(ui, server)

关于r - 在 Shiny 模块的 renderUI() 中使用 lapply(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43260089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com