使用"df"作为DataFrame名称是否安全?调用tree包时为何报错?
问题原因及解决方法
这个报错的根源是变量名冲突——你用df作为数据框的名字,但tree包的partition.tree()函数恰好有一个同名的参数df(逻辑类型,用来控制是否用深度优先填充绘制分区)。
当你调用partition.tree(tr)时,函数内部的作用域会优先把df解析成它自己的参数(默认值是TRUE,一个逻辑值),而不是你在全局环境中定义的那个数据框。这就导致函数尝试把逻辑值转换成数据框,从而抛出cannot coerce class ""function""(报错信息被截断,实际是逻辑值无法转成数据框)的错误。
解决方法有几种,选哪种都可以:
方法1:重命名你的数据框(最稳妥,避免后续再踩类似坑)
把数据框的名字改成df以外的,比如mydf,重新运行整个流程:library(tree) mydf <- droplevels(iris[1:100,c(1,2,5)]) tr <- tree(Species ~ ., data = mydf) plot(tr) text(tr) partition.tree(tr)方法2:调用
partition.tree时显式指定数据来源
如果你不想改变量名,可以在调用时明确告诉函数用全局环境的df:partition.tree(tr, data = .GlobalEnv$df)方法3:显式传递
df参数的值
因为partition.tree的df参数默认是TRUE,你可以显式把它写出来,让函数明确区分参数和你的变量:partition.tree(tr, df = TRUE)
亲测这几种方法都能解决这个报错,顺利画出分区树~
内容的提问来源于stack exchange,提问作者John Coleman
相关产品推荐
相关产品推荐

