R 访问';数据';with()函数的参数?

R 访问';数据';with()函数的参数?,r,dataframe,R,Dataframe,在with()函数的expr表达式中,是否可以直接访问数据参数?以下是我在概念上的意思: > print(df) result qid f1 f2 f3 1 -1 1 0.0000 0.1253 0.0000 2 -1 1 0.0098 0.0000 0.0000 3 1 1 0.0000 0.0000 0.1941 4 -1 2 0.0000 0.2863 0.0948 5 1 2 0.0000

with()
函数的
expr
表达式中,是否可以直接访问
数据
参数?以下是我在概念上的意思:

> print(df)
  result qid     f1     f2     f3
1     -1   1 0.0000 0.1253 0.0000
2     -1   1 0.0098 0.0000 0.0000
3      1   1 0.0000 0.0000 0.1941
4     -1   2 0.0000 0.2863 0.0948
5      1   2 0.0000 0.0000 0.0000
6      1   2 0.0000 0.7282 0.9087
> with(df, subset(.data, select=f1:f3))  # Doesn't work
当然,上面的例子有点傻,但对于这样的事情,它会很方便:

with(subset(df, f2>0), foo(qid, vars=subset(.data, select=f1:f3)))
我试着在
environment()
parent.frame()
等方面进行研究,但没有找到任何有效的方法


也许这真的是一个关于
eval()
的问题,因为这就是
with.default()
的实现方式。

我倾向于将其反转,即将
with()
放在外部,并让
子集()
处理其数据:

R> data(mtcars)
R> with(subset(mtcars, gear==4), lm(mpg ~ wt)) # no data arg

Call:
lm(formula = mpg ~ wt)

Coefficients:
(Intercept)           wt  
      42.49        -6.86  
这也是一个愚蠢的例子,因为
lm(mpg~wt,data=mtcars,subset=gear==4)

显然也是这样,但你得到了漂移。

我倾向于将其反转,即将
with()
放在外部,并让
子集()处理其数据:

R> data(mtcars)
R> with(subset(mtcars, gear==4), lm(mpg ~ wt)) # no data arg

Call:
lm(formula = mpg ~ wt)

Coefficients:
(Intercept)           wt  
      42.49        -6.86  
这也是一个愚蠢的例子,因为
lm(mpg~wt,data=mtcars,subset=gear==4)
显然也是这样,但是你得到了答案。

使用
parent.frame()

如你所见:

  • parent.frame(3)
    是基本环境(在本例中)
  • parent.frame(2)
    子集
    函数的环境
  • parent.frame(1)
    {
    功能的环境(请参见
    ?Paren
使用
parent.frame()

如你所见:

  • parent.frame(3)
    是基本环境(在本例中)
  • parent.frame(2)
    子集
    函数的环境
  • parent.frame(1)
    {
    功能的环境(请参见
    ?Paren

太棒了,谢谢。我不知道为什么我在拨弄
parent.frame()时没有弄明白这一点,我想我没有尝试足够的级别。所以现在我可以做:
。太棒了,谢谢。不知道为什么我在拨弄
parent.frame()时没有弄明白这一点
,我想我没有尝试足够的级别。所以现在我可以做到:
。这实际上并不能解决问题-在我最初的示例中,请注意,我调用了
子集()
两次,一次按行过滤,一次按列过滤。我不能同时执行这些操作,因为我实际上需要在调用
foo()时使用额外的列
这不是我在第二个
subset()
中选择的列的一部分。这实际上并不能解决问题-在我最初的示例中,请注意我调用了
subset()
两次,一次按行过滤,一次按列过滤。我不能同时执行这些操作,因为我实际上需要在调用
foo时使用额外的列()
这不是我在第二个
子集()中选择的列的一部分。
with(subset(dfrm, x1<0), {
    print(ls())
    print(ls(parent.frame(1)))
    print(ls(parent.frame(2)))
    print(ls(parent.frame(3)))
})
# [1] "g1" "x1" "x2"
# [1] "enclos" "envir"  "expr"  
# [1] "data" "expr"
# [1] "dfrm"