为什么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))