我正在研究一些代码,我发现了一些特殊的东西。 当我在某些面板数据的子集上运行LM时,我可以正常工作,如下所示:
library('plm')
data(Cigar)
lm(log(price) ~ log(pop) + log(ndi), data=Cigar, subset=Cigar$state==1)
Call:
lm(formula = log(price) ~ log(pop) + log(ndi), data = Cigar,
subset = Cigar$state == 1)
Coefficients:
(Intercept) log(pop) log(ndi)
-26.4919 3.2749 0.4265
但是当我尝试将它包装在一个函数中时,我得到了:
myfunction <- function(formula, data, subset){
return(lm(formula, data, subset))
}
myfunction(formula = log(price) ~ log(pop) + log(ndi), data = Cigar, subset = Cigar$state==1)
Error in xj[i] : invalid subscript type 'closure'
我真的不明白这里发生了什么,但它打破了我写的其他一些代码,所以我想知道。
答案 0 :(得分:6)
问题似乎与子集无关。当我更改为subset = (state == 1)
时,我的函数会出现相同的错误。函数的参数未被正确传递和计算。
我认为你最好不要使用do.call
myfunction <- function(formula, data, subset) {
do.call("lm", as.list(match.call()[-1]))
}
myfunction(log(price) ~ log(pop) + log(ndi), Cigar, state == 1)
# Call:
# lm(formula = log(price) ~ log(pop) + log(ndi), data = Cigar,
# subset = state == 1)
#
# Coefficients:
# (Intercept) log(pop) log(ndi)
# -26.4919 3.2749 0.4265
答案 1 :(得分:4)
您很可能遇到非标准评估问题(lm
函数使用非标准评估)。使用非标准评估的函数在命令行中很方便,但在从其他函数调用时可能会导致问题。
关于该主题的一些额外阅读包括高级R中的Standard Nonstandard Evaluation Rules和this chapter