首页 > 解决方案 > 使用 do.call 在 R Shiny 中创建 ui

问题描述

我正在查看是否可以使用 do.call 创建一个 R Shiny ui 函数,但我不知道下面的问题。首先,如果我做一个没有 do.call 的基本示例......

library(shiny)

ui <- fluidPage(
  titlePanel("A title"),
  fluidRow(column(width = 12,"some content",))
)

server <- function(input, output) {}
shinyApp(ui = ui, server = server)

...然后这会按预期呈现一个在下面显示“A 标题”和“一些内容”的页面。

然后,如果我尝试使用 do.call 做我认为完全相同的事情,如下所示......

library(shiny)

page_data <- c(
  titlePanel("A title"),
  fluidRow(column(width = 12,"some content",))
)
ui <- do.call(fluidPage, as.list(page_data))

server <- function(input, output) {}
shinyApp(ui = ui, server = server)

...那么这不会呈现相同的页面。有趣的是,它运行时没有错误并显示“A 标题”而不是“某些内容”。有什么想法可以解释为什么它会呈现不同的效果吗?并且是否可以使用 do.call 类型的接口来实现?

标签: rshiny

解决方案


您可以在开始时定义列表而不是向量,因此as.list()以后不要使用。但是,我不知道为什么 usinglist()不同于as.list(c())

library(shiny)

page_data <- list(
  titlePanel("A title"),
  fluidRow(column(width = 12,"some content",))
)
ui <- do.call(fluidPage, page_data)

server <- function(input, output) {}
shinyApp(ui = ui, server = server)

编辑:实际上,我们可以看到两个表达式之间的一些差异:

list(
  titlePanel("A title"),
  fluidRow(column(width = 12,"some content",))
)

[[1]]
<h2>A title</h2>

[[2]]
<div class="row">
  <div class="col-sm-12">some content</div>
</div>
as.list(c(
  titlePanel("A title"),
  fluidRow(column(width = 12,"some content",))
))

[[1]]


[[2]]
<h2>A title</h2>

$name
[1] "div"

$attribs
$attribs$class
[1] "row"


$children
$children[[1]]
<div class="col-sm-12">some content</div>

推荐阅读