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

Flo*_*rer 1 r

我正在使用randomForestR 2.15.2中的软件包(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
Run Code Online (Sandbox Code Playgroud)

问题:

1)我在哪里可以找到源代码partialPlot

2)如何编写一个以字符串x1作为参数x1 == as.character(x1)的函数,但该函数在as.character未应用时会抛出错误x1

3)当我将它包装在函数中时为什么会失败?是partialPlot与环境搞乱不知何故?

提示/尝试的事情可能有助于我将来解决这些问题,这也是非常受欢迎的!

Ric*_*ven 5

partialPlot()通过输入找到源代码

randomForest:::partialPlot.randomForest 
Run Code Online (Sandbox Code Playgroud)

进入控制台.我首先跑步找到了这个

methods(partialPlot)
Run Code Online (Sandbox Code Playgroud)

因为进入partialPlot只告诉我它使用了一种方法.从methods调用我们看到有一个方法,旁边的星号告诉我们它是一个非导出函数.要查看非导出函数的源代码,我们使用三重冒号运算符:::.就这样吧

package:::generic.method
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这适用于我的机器.环境并不像评估那么多.许多绘图函数使用一些非标准的评估,这种评估可以在大多数情况下使用此do.call()构造进行处理.

但请注意,在函数外,你也可以使用eval()x1.

partialPlot(x = rf, pred.data = iris, x.var = eval(x1))
Run Code Online (Sandbox Code Playgroud)

我真的没有理由检查as.character()函数内部是否存在.如果您可以留言,我们可以从那里开始,如果您需要更多信息.我对这个软件包还不够熟悉,还有待进一步了解.