首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用lazyeval捕获data.frame (或非原子)对象

用lazyeval捕获data.frame (或非原子)对象
EN

Stack Overflow用户
提问于 2015-07-20 17:30:33
回答 2查看 118关注 0票数 1

是否有一种(首选)方法可以懒洋洋地使用data.frame包捕获lazyeval或其他非原子对象?lazyeval似乎阻止了这一点:

代码语言:javascript
复制
library(lazyeval)
data(iris)
f <- function(x) lazyeval::lazy_(x, parent.frame() )
f(iris)

我知道这个错误:

代码语言:javascript
复制
Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE 

在原子对象上,这个工作方式与预期一样,返回一个延迟对象,其中包含一个未计算的表达式和环境。

代码语言:javascript
复制
> f(1:10)
<lazy>
  expr: 1:10
  env:  <environment: R_GlobalEnv>

预期产出

我很惊讶,因为医生说:

使用惰性(),就像使用替代()来捕获未评估的承诺一样。

subsitute可用于捕获未评估的名称(获取parent.frame非常简单):

代码语言:javascript
复制
> f <- function(x) substitute(x)
> f(iris)
iris      # name

我对拉齐瓦尔的期望是:

代码语言:javascript
复制
f(iris) 
<lazy>
  expr: iris
  env:  <environment: R_GlobalEnv>

我可能漏掉了什么?帮助?

相关信息

代码语言:javascript
复制
> R.version.string
[1] "R version 3.2.1 (2015-06-18)"

> packageVersion('lazyeval')
[1] 0.1.10.9000

更新

@MrFlick有一个不错的答案(见下文),但两者都没有产生预期的结果:

代码语言:javascript
复制
> 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中;只需要名称。

代码语言:javascript
复制
> f <- function(x) lazyeval::lazy_( quote(x), parent.frame() )
> f(iris)
<lazy>
  expr: x
  env:  <environment: R_GlobalEnv>

这捕获了正确的env,但捕获了错误的表达式。

回答

在@MrFlick的输入下,这似乎是可行的,但它需要额外的subtitute才能使其正常工作。不过,我不完全清楚为何:

代码语言:javascript
复制
f <- function(x) lazyeval::lazy_( substitute(x), parent.frame() )
f(iris)
f(1:10)
a = 1:5
f(a)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 18:28:21

“MrFlick先生”说,这似乎是可行的,但它需要额外的资金才能使它正常工作。不过,我不完全清楚为何:

代码语言:javascript
复制
f <- function(x) lazyeval::lazy_( substitute(x), parent.frame() )
f(iris)
f(1:10)
a = 1:5
f(a)
票数 0
EN

Stack Overflow用户

发布于 2015-07-20 17:41:33

lazy()lazy_()是略有不同的功能。我想你也想

代码语言:javascript
复制
f <- function(x) lazyeval::lazy(x, parent.frame())

代码语言:javascript
复制
f <- function(x) lazyeval::lazy_(quote(x), environment())

注意,lazy_()函数需要引用名称,而lazy()则为您做引号。还请注意,我们为lazy_调用使用了函数环境,因为这是定义x的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31522745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档