使用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)
是否有一种(首选)方法可以使用 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)