是什么导致randomForest.partialPlot函数中出现这种奇怪的行为?

时间:2015-09-23 23:15:19

标签: r

我在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以某种方式弄乱了环境吗?

我可能会非常欢迎您在将来尝试解决此类问题时可能会有所帮助的提示/事项!

1 个答案:

答案 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()。如果您可以留言,我们可以从那里开始,如果您需要更多信息。我对这个软件包还不够熟悉,还有待进一步了解。