Rmarkdown
文档:---
title: "Environments"
author: "Me"
date: "2023-01-13"
output: html_document
---
```{r setup}
library(glue)
library(purrr)
```
```{r vars}
a <- 1
x <- list("`a` has the value: {a}")
```
```{r works}
glue(x[[1L]])
```
```{r does-not-work, error = TRUE}
map_chr(x, glue)
```
当使用 RStudio
的 knit 按钮时,一切都像魔法般地运作,输出如下:
然而,如果我尝试使用自己的环境调用渲染,它会失败:
ne <- new.env()
render("env.Rmd", envir = ne)
显然,当在purrr::map
中使用glue
时,它会在环境上出现问题。
如果我想在自己的环境中调用render
而不生成此错误,该怎么办?理想情况下,我不想改变Rmarkdown
本身。
更新
有趣的是,如果我将glue
包装在自己的function
中,事情又变得顺畅了:
```
glue <- function(...) glue::glue(...)
map_chr(x, glue)
```
更新 2
问题似乎与 knitr/rmarkdown
无关,但是一个常规的作用域问题似乎与涉及函数所定义的环境有关:
library(rlang)
library(purrr)
library(glue)
rm(list = ls())
e <- env(a = 1, x = "`a` has the value: {a}")
delayedAssign("res", map_chr(x, glue), e, e)
e$res
# Error:
# ℹ In index: 1.
# Caused by error:
# ! object 'a' not found
## as opposed to
a <- 1
x <- "`a` has the value: {a}"
delayedAssign("res", {
map_chr(x, glue)
})
res
# [1] "`a` has the value: 1"
map()
调用中使用lambda/匿名函数:map_chr(x, \(v) glue(v))
。 - Ritchie Sacramento