是否有一种(首选)方法可以懒洋洋地使用data.frame包捕获lazyeval或其他非原子对象?lazyeval似乎阻止了这一点:
library(lazyeval)
data(iris)
f <- function(x) lazyeval::lazy_(x, parent.frame() )
f(iris)我知道这个错误:
Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE 在原子对象上,这个工作方式与预期一样,返回一个延迟对象,其中包含一个未计算的表达式和环境。
> f(1:10)
<lazy>
expr: 1:10
env: <environment: R_GlobalEnv>预期产出
我很惊讶,因为医生说:
使用惰性(),就像使用替代()来捕获未评估的承诺一样。
subsitute可用于捕获未评估的名称(获取parent.frame非常简单):
> f <- function(x) substitute(x)
> f(iris)
iris # name我对拉齐瓦尔的期望是:
f(iris)
<lazy>
expr: iris
env: <environment: R_GlobalEnv>我可能漏掉了什么?帮助?
相关信息
> R.version.string
[1] "R version 3.2.1 (2015-06-18)"
> packageVersion('lazyeval')
[1] 0.1.10.9000更新
@MrFlick有一个不错的答案(见下文),但两者都没有产生预期的结果:
> f <- function(x) lazyeval::lazy(x,parent.frame())
> f(iris)
<lazy>
expr: structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, ...
env: <environment: R_GlobalEnv>它将虹膜存储在expr中;只需要名称。
> f <- function(x) lazyeval::lazy_( quote(x), parent.frame() )
> f(iris)
<lazy>
expr: x
env: <environment: R_GlobalEnv>这捕获了正确的env,但捕获了错误的表达式。
回答
在@MrFlick的输入下,这似乎是可行的,但它需要额外的subtitute才能使其正常工作。不过,我不完全清楚为何:
f <- function(x) lazyeval::lazy_( substitute(x), parent.frame() )
f(iris)
f(1:10)
a = 1:5
f(a)发布于 2015-08-04 18:28:21
“MrFlick先生”说,这似乎是可行的,但它需要额外的资金才能使它正常工作。不过,我不完全清楚为何:
f <- function(x) lazyeval::lazy_( substitute(x), parent.frame() )
f(iris)
f(1:10)
a = 1:5
f(a)发布于 2015-07-20 17:41:33
lazy()和lazy_()是略有不同的功能。我想你也想
f <- function(x) lazyeval::lazy(x, parent.frame())或
f <- function(x) lazyeval::lazy_(quote(x), environment())注意,lazy_()函数需要引用名称,而lazy()则为您做引号。还请注意,我们为lazy_调用使用了函数环境,因为这是定义x的地方。
https://stackoverflow.com/questions/31522745
复制相似问题