为什么with(data,summarySE(…)返回';数学函数的非数值参数';错误?

为什么with(data,summarySE(…)返回';数学函数的非数值参数';错误?,r,R,如果我正确理解with(),则以下结果应相同: > myFunction(data, ...) > with(data, myFunction(...)) 例如,以下内容生成相同的绘图 > plot(data=mtcars, mpg ~ disp) > with(mtcars, plot(mpg ~ disp)) 然而,我很难理解以下内容 > library(Rmisc) # provides summarySE() and summarySEWithin(

如果我正确理解
with()
,则以下结果应相同:

> myFunction(data, ...)
> with(data, myFunction(...))
例如,以下内容生成相同的绘图

> plot(data=mtcars, mpg ~ disp)
> with(mtcars, plot(mpg ~ disp))
然而,我很难理解以下内容

> library(Rmisc)   # provides summarySE() and summarySEWithin()
> summarySE(data=subset(mtcars, gear==4), measurevar="hp",
+           groupvars=c("am", "carb"))
  am carb N    hp       sd        se        ci
1  0    2 2  78.5 23.33452 16.500000 209.65238
2  0    4 2 123.0  0.00000  0.000000   0.00000
3  1    1 4  72.5 13.67479  6.837397  21.75965
4  1    2 2  80.5 40.30509 28.500000 362.12683
5  1    4 2 110.0  0.00000  0.000000   0.00000
> with(subset(mtcars, gear==4), {
+   summarySE(measurevar="hp", groupvars=c("am", "carb"))
+ })
The following `from` values were not present in `x`: mean
Error in sqrt(datac$N) : non-numeric argument to mathematical function
为什么直接提供数据参数时,
summarySE()
的输出很好,而通过
with()
提供时却不行

问题似乎出现在summarySE()的第44行:


datac$se没有理由认为
myFunction(data,…)
with(data,myFunction(…)
应该是相同的<代码>数据
不是参数的保留名称(也不是第一个位置参数的保留名称),实际上可以是任何名称。
(编辑:在末尾添加旁注(*))

也就是说,
数据
被期望为数据帧,并且其元素通过函数调用的其他参数中的标准或非标准求值而可用,这确实是一种非常常见的模式。
即使如此,有些函数允许在调用环境中或在
数据中获取这些“其他参数”,如
plot()
在您的示例中,有些函数不允许。。。类似于
summarySE()
,它要求
measurevar
groupvars
可以在
数据中找到,而不是在调用环境中

因此,我认为没有简单的方法“确保
summarySE()
with()
获取数据参数”。或者我可以想到一个,但这有点荒谬,完全违背了使用
with()
的目的:


(*)旁注:

(with()
所做的只是在计算
expr
时提供
数据的元素。它的源代码只有一行!
eval(replacement(expr),data,enclose=parent.frame())


(顺便说一下,您描述的行为更像是
magrittr
管道:
myFunction(data,…)
`%>%`(data,myFunction(…)
或多或少是等效的(或者更常见的是:
data%>%myFunction(…)
).

谢谢,@Aurèle清晰的回答和解释。显然,我对
with()
的用途假设太多了。关于R。。。
datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
(function(data)
  with(data, summarySE(data, measurevar="hp", groupvars=c("am", "carb")))
)(subset(mtcars, gear==4))