在 R 中使用管道时如何维护函数中的默认值?

How to maintain defaults in a function when using the pipe in R?

我觉得这应该是一个非常容易的任务,但我似乎无法在网上找到答案。我只是想做这样的事情:

stringr::str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval()

但这行不通;当我打电话给 x 时,它告诉我找不到它。我知道这是一系列有效的函数,因为它有效:

eval(parse(text = stringr::str_interp("x <- ${rnorm(1)}")))

知道如何实现吗?谢谢!

注意:我使用的是来自github version of stringr, which is where the str_interp的函数。

这里有几个问题。首先,嵌套函数从内到外计算,所以它应该是

str_interp --> parse --> eval

因为 parse() 进入 eval()。串起来,解析它,评估它。接下来,您需要在父框架 eval() 的默认环境以外的环境中对其进行评估。我选择了全局环境。

library(magrittr)
str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval(globalenv())
x
# [1] 0.1542613

注意: 重现此内容的必要函数在 stringr 开发版本中,可在此处找到:https://github.com/hadley/stringr/blob/master/R/interp.R