我在R 2.15.2中使用randomForest
包(v.4.6-7)。我找不到partialPlot
函数的源代码,并试图找出它的确切功能(帮助文件似乎不完整。)它应该将变量x.var
的名称视为一个论点:
library(randomForest)
data(iris)
rf <- randomForest(Species ~., data=iris)
x1 <- "Sepal.Length"
partialPlot(x=rf, pred.data=iris, x.var=x1)
# Error in `[.data.frame`(pred.data, , xname) : undefined columns selected
partialPlot(x=rf, pred.data=iris, x.var=as.character(x1))
# works!
typeof(x1)
# [1] "character"
x1 == as.character(x1)
# TRUE
# Now if I try to wrap it in a function...
f <- function(w){
partialPlot(x=rf, pred.data=iris, x.var=as.character(w))
}
f(x1)
# Error in as.character(w) : 'w' is missing
1)我在哪里可以找到partialPlot
的源代码?
2)如何编写一个函数,该函数将x1
作为x1 == as.character(x1)
的参数,但是当as.character
未应用于{x1
时,该函数会抛出错误1}?
3)当我将它包装在一个函数中时为什么会失败? partialPlot
以某种方式弄乱了环境吗?
我可能会非常欢迎您在将来尝试解决此类问题时可能会有所帮助的提示/事项!
答案 0 :(得分:5)
输入
可找到partialPlot()
的源代码
randomForest:::partialPlot.randomForest
进入控制台。我首先运行
找到了这个methods(partialPlot)
因为输入partialPlot
只会告诉我它使用了一种方法。从methods
调用,我们看到有一种方法,旁边的星号告诉我们它是一个非导出函数。要查看非导出函数的源代码,我们使用三重冒号运算符:::
。所以它就是
package:::generic.method
包package
的位置,generic
是通用函数(此处为partialPlot
),method
是方法(此处为randomForest
法)。
现在,对于其他问题,可以使用do.call()
编写函数,并且可以在没有包装器的情况下传递w
。
f <- function(w) {
do.call("partialPlot", list(x = rf, pred.data = iris, x.var = w))
}
f(x1)
这适用于我的机器。环境并不像评估那么多。许多绘图函数使用一些非标准的评估,这些评估可以使用此do.call()
构造在大多数情况下进行处理。
但请注意,在该功能之外,您还可以在eval()
上使用x1
。
partialPlot(x = rf, pred.data = iris, x.var = eval(x1))
我真的没有理由检查函数内是否存在as.character()
。如果您可以留言,我们可以从那里开始,如果您需要更多信息。我对这个软件包还不够熟悉,还有待进一步了解。