r - 使用 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 类型的接口来实现?
解决方案
您可以在开始时定义列表而不是向量,因此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>
推荐阅读
- phpspreadsheet - 如何更改工作表标题颜色背景?
- azure-devops - 我可以制定 Team Foundation Server 2018 的交付计划吗?
- postgresql - Clojure:带有 postgres 的 jdbc/insert 返回 1 而不是新插入的行
- xtext - 如何使 XTEXT 模板不区分大小写?
- python - Python AES 解密 struct TypeError
- ios - 在 ios 中使用 ARKit 显示演练
- sql-server - 阶乘函数错误 - 超出最大存储过程、函数、触发器或视图嵌套级别
- c# - 如何使用 fileupload 将图像存储到项目外部的另一个文件夹?
- r - 使用 [r] 通过 POST 请求从 Internet 获取数据的问题
- php - 在 php OOP 中使用 $this 可以访问不定义公共属性