`transform`和`within`之间有什么区别?

Ren*_*rop 10 r

阅读这个优秀的帖子我遇到了withintransform.

阅读这两个帮助文件我不幸的是没有完全理解差异是什么......

我尝试过类似的东西:

df <- data.frame(A = runif(5), B = rnorm(5))
A=1:5
within(df, C<-A+B)
transform(df,C=A+B)
Run Code Online (Sandbox Code Playgroud)

两次输出都是:

          A          B         C
1 0.2326266  1.3237210 1.5563476
2 0.4581693 -0.2605674 0.1976018
3 0.6431078  0.5920021 1.2351099
4 0.9682578  1.1964012 2.1646590
5 0.9889942  0.5468008 1.5357950
Run Code Online (Sandbox Code Playgroud)

所以两者似乎都在创造一种新的环境,因为他们A=1:5在评估中忽略了这一点.

提前致谢!

G. *_*eck 14

within允许您稍后使用之前定义的变量,但不能transform:

within(BOD, { a <- demand; b <- a }) # ok
transform(BOD, a = demand, b = a) # error
Run Code Online (Sandbox Code Playgroud)

请注意,我已经定义了一个变体,transform它的行为更像within是几年前这里被调用的地方my.transform.使用它我们可以像这样写上面的内容:

my.transform(BOD, a = demand, b = a) # ok
Run Code Online (Sandbox Code Playgroud)

在上面的例子within(或my.transform)会更好,但在以下transform更好:

transform(BOD, Time = demand, demand = Time) # swap columns
within(BOD, { Time <- demand; demand <- Time }) # oops
Run Code Online (Sandbox Code Playgroud)

(要执行交换,within需要我们定义一个临时的.)

编辑

my.transform现在在gsubfn CRAN包中调用它transform2. mutate在dplyr从左到右工作.

需要注意的是transform,transform2mutate每个运作方式略有不同.RHS transform论证都涉及原始值.mutate参数的RHS 指的是最近的从左到右的值. transform2找出依赖关系并使用它们,以便依赖关系可以在它使用的参数之前或之后出现.