2017-04-21 22 views
2

我的名字收集一些对象使用什么样的环境中保存为一个RDS的列表:我应该%>%MGET

A = 1 
B = 2 
mget(c("A","B")) 

如果我要管......

library(magrittr) 
c("A","B") %>% mget     # nope 
c("A","B") %>% mget(env = globalenv()) # ok 

但是如果我一些环境中工作,我不想重新输入其名称...

e = new.env() 
e$a = 1 
e$b = 2 
with(e, { 
    # do some stuff, then... 
    c("a","b") %>% mget 
}) 

我假设我应该输入%>% mget(env = something),但无法弄清楚什么(除了e)。

+0

我要求更多的是出于好奇,比这个迫切需要... – Frank

+0

嘿,所以这里经过阅读理查德·斯克里文的回答HTTP:/ /stackoverflow.com/a/27054476/我试过每个parent.frame(n),发现n = 6的作品。去搞清楚。 – Frank

回答

3

你也许可以用parent.env(environment())逃脱,如

with(e, { c("a","b") %>% mget(env=parent.env(environment())) }) 
+0

谢谢!新的变体:我能做出这样的作品吗? 'mmget < - mget; (mmget)[[“envir”]] < - quote(parent.env(environment())); (e,c(“a”,“b”)%>%mmget)'或者这太愚蠢了吗? – Frank

+0

无论如何,如果你不知道或不愿意延长答案来覆盖这一点,我可以发布一个新问题。我无法弄清楚超出了'mmget < - mget; (mmget)[[“envir”]] < - quote(parent.frame(7)); (e,c(“a”,“b”)%>%mmget)“,看起来非常脆弱。 – Frank

+1

@真是太麻烦了。如果你在那里定义'mmet',那么它的封闭环境将是全球性的,所以它的父母将成为基础。对环境的评估需要延迟到管道环境包装的内部。 – jenesaisquoi