R中的内部和内部有什么区别?

nan*_*nan 13 environment r

在我的研究背景下,我总是使用"with"而不是"within",但我原本以为它们是相同的.刚才我错误地将"with"改为"within"并且返回的结果完全不同.我想知道为什么?

我正在使用plyr包中的棒球数据,所以我首先加载库

 require(plyr)
Run Code Online (Sandbox Code Playgroud)

然后,我想选择ID为" ansonca01 "的所有行.首先,正如我所说,我使用" 内部 ",并运行如下函数:

within(baseball, baseball[id=="ansonca01", ])
Run Code Online (Sandbox Code Playgroud)

我得到了非常奇怪的结果,基本上包括一切:

       id year stint team lg   g  ab   r   h X2b X3b hr rbi  sb cs  bb  so ibb hbp sh sf gidp
4     ansonca01 1871     1  RC1     25 120  29  39  11   3  0  16   6  2   2   1  NA  NA NA NA   NA
44    forceda01 1871     1  WS3     32 162  45  45   9   4  0  29   8  0   4   0  NA  NA NA NA   NA
68    mathebo01 1871     1  FW1     19  89  15  24   3   1  0  10   2  1   2   0  NA  NA NA NA   NA
99    startjo01 1871     1  NY2     33 161  35  58   5   1  1  34   4  2   3   0  NA  NA NA NA   NA
102   suttoez01 1871     1  CL1     29 128  35  45   3   7  3  23   3  1   1   0  NA  NA NA NA   NA
106   whitede01 1871     1  CL1     29 146  40  47   6   5  1  21   2  2   4   1  NA  NA NA NA   NA
113    yorkto01 1871     1  TRO     29 145  36  37   5   7  2  23   2  2   9   1  NA  NA NA NA   NA
.........
Run Code Online (Sandbox Code Playgroud)

然后我使用" with "而不是" within ",

 with(baseball, baseball[id=="ansonca01",])
Run Code Online (Sandbox Code Playgroud)

并得到了我期望的结果

      id year stint team lg   g  ab   r   h X2b X3b hr rbi sb cs  bb so ibb hbp sh sf gidp
4    ansonca01 1871     1  RC1     25 120  29  39  11   3  0  16  6  2   2  1  NA  NA NA NA   NA
121  ansonca01 1872     1  PH1     46 217  60  90  10   7  0  50  6  6  16  3  NA  NA NA NA   NA
276  ansonca01 1873     1  PH1     52 254  53 101   9   2  0  36  0  2   5  1  NA  NA NA NA   NA
398  ansonca01 1874     1  PH1     55 259  51  87   8   3  0  37  6  0   4  1  NA  NA NA NA   NA
525  ansonca01 1875     1  PH1     69 326  84 106  15   3  0  58 11  6   4  2  NA  NA NA NA   NA
Run Code Online (Sandbox Code Playgroud)

我通过键入help(with)R环境检查了with和within的文档,并得到以下内容:

with是一个泛型函数,用于在由数据构造的本地环境中计算expr.环境将调用者的环境作为其父级.这对于简化对建模函数的调用很有用.(注意:如果数据已经是一个环境,那么它将与其现有父级一起使用.)

请注意,expr中的赋值发生在构造的环境中,而不是在用户的工作区中.

内部类似,只是它在评估expr之后检查环境并对数据进行相应的修改(如果创建了无法存储在数据框中的对象,则可能在数据框情况下失败),并返回它.内部可以用作变换的替代方案.

从这种差异的解释,我不明白为什么我用这么简单的操作得到了不同的结果.有人有想法吗?

the*_*ail 16

我发现简单的例子经常起到突出作用的作用.就像是:

df <- data.frame(a=1:5,b=2:6)
df
  a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

with(df, {c <- a + b; df;} )
  a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

within(df, {c <- a + b; df;} )
# equivalent to: within(df, c <- a + b)
# i've just made the return of df explicit 
# for comparison's sake
  a b  c
1 1 2  3
2 2 3  5
3 3 4  7
4 4 5  9
5 5 6 11
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 11

文件是关于语义和返回值相当清楚(和很好的话,每天的意义"与"相匹配,"以内"):

值:

对于' with',评估的值' expr'.对于' within',修改后的对象.

由于您的代码不会修改任何内部baseball,因此baseball返回未修改的代码.with另一方面,不返回对象,它返回expr.

这是expression修改对象的示例:

> head(within(cars, speed[dist < 20] <- 1))
Run Code Online (Sandbox Code Playgroud)
  speed dist
1     1    2
2     1   10
3     1    4
4     7   22
5     1   16
6     1   10
Run Code Online (Sandbox Code Playgroud)