使用lazyeval捕获一个data.frame(或非原子)对象

Capture a data.frame (or non-atomic) object with lazyeval

是否有一种(首选)方法可以使用 lazyeval 包来懒惰地捕获 data.frame 或其他非原子对象?似乎 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>

预期输出

我很惊讶,因为文档说:

Use lazy() like you'd use substitute() to capture an unevaluated promise.

subsitute 可用于捕获未计算的 name(获取 parent.frame 很简单):

> f <- function(x) substitute(x)
> f(iris)
iris      # name

我对lazyeval的期望是:

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)

lazy()lazy_() 是略有不同的函数。我想你也想要

f <- function(x) lazyeval::lazy(x, parent.frame())

f <- function(x) lazyeval::lazy_(quote(x), environment())

请注意,lazy_() 函数需要引用名称,而 lazy() 会为您进行引用。另请注意,我们为 lazy_ 调用使用函数环境,因为那是定义 x 的地方。

受@MrFlick 启发,这似乎可行,但需要额外的字幕才能使其正常工作。但是,我不完全确定为什么:

f <- function(x) lazyeval::lazy_( substitute(x), parent.frame() )
f(iris)
f(1:10)
a = 1:5
f(a)