我正在收集数据并在文档中创建一些图形,我们称之为
main.qmd
。然后,在另一个文档(例如 knitr::knit_child
)上使用 sub.qmd
循环,使用 main.qmd
中定义的数据,创建其他数字。在 Posit Workbench 中渲染时效果很好。
但是,当我将结果发布到 Posit Connect 时,它失败了:
sub.qmd
无法访问在 main.qmd
中创建的值。
到目前为止我所做的:
使用
environment()
,两个文件似乎都处于同一环境中(R_GlobalEnv),因此似乎不存在范围问题(?)。我已经在 main.qmd
中使用该对象创建了一个环境,并将该环境传递给 knit_child
。没有运气。
我已从
main.qmd
写入数据库,并尝试从 sub.qmd
读取数据。这里发生了一些非常奇怪的事情:在 a
中创建并保存的对象 (main.qmd
)(由 DBI::dbWriteTable(con, "a", data.frame(a = a))
保存)显示在 DBI::dbListTables(con)
中对 sub.qmd
的调用中,但是当我尝试读取 a
时从表中 (DBI::dbReadTable(con, "a")$a
) 连接渲染失败。
我尝试使用引脚包创建引脚。结果相当于2中的结果。
我尝试将数据保存为
a.rds
中的main.qmd
并从sub.qmd
中读取。再次,如 2 中所示。
发生了什么,如何访问在
main.qmd
中创建的对象?Reprex(无保存):
main.qmd:
sub.qmd
sub.qmd:
## Main
This is from the main document
## Sub
```{r}
#| results: asis
for (i in c(1,2)) {
res <- knitr::knit_child("sub.qmd", quiet = TRUE)
cat(res, sep = "\n")
}
```
最小的、可重现的示例 2(使用 .rds 保存/读取)。
在示例中,
```{r}
print(paste("sub:", i))
```
为 TRUE,但
file.exists("a.rds")
会引发错误...main.qmd:
readRDS("a.rds")
sub.qmd:
## Main
This is from the main document:
```{r}
a <- 1
saveRDS(a, "a.rds")
```
## Sub
```{r}
#| results: asis
cat(
knitr::knit_child("sub.qmd", quiet = TRUE)
)
```
This is from the sub document:
```{r}
file.exists("a.rds")
# a <- readRDS("a.rds")
# print(a)
```
文件进行连接时,似乎以任意顺序运行所有文件。如果其中一个文件用作子文档并使用仅在主脚本中定义的变量,则部署将失败。
要解决此问题,如果 quarto 尝试将子文档渲染为独立文件,您可以优雅地终止渲染。假设主脚本中定义了.qmd
:
variable_name
这应该让您部署所有文件并且它应该按预期工作。