mlr3示例中resample函数报错:无法找到匹配方法的解决方案
mlr3中resample函数报错的原因及解决方法
问题重现
运行以下mlr3代码时触发错误:
library(mlr3verse) task_penguins = as_task_classif(species ~ ., data = palmerpenguins::penguins) learner = lrn("classif.rpart", cp = .01) resampling = rsmp("cv", folds = 3L) rr = resample(task_penguins, learner, resampling)
错误信息:
Error: unable to find an inherited method for function ‘resample’ for signature ‘x = "TaskClassif", y = "LearnerClassifRpart"’ 3. stop(gettextf("unable to find an inherited method for function %s for signature %s", sQuote(fdef@generic), sQuote(cnames)), call. = FALSE, domain = NA) 2. (function (classes, fdef, mtable) { methods <- .findInheritedMethods(classes, fdef, mtable) if (length(methods) == 1L) ... 1. resample(task_penguins, learner, resampling)
错误原因
这个错误的核心是命名空间冲突:当前环境中加载了其他也定义了resample函数的包(比如caret或旧版本dplyr),这些包的resample函数覆盖了mlr3中的同名方法,导致R无法识别mlr3专属的Task和Learner对象类型。
解决方法
有两种可靠的解决方式:
方式一:指定mlr3命名空间调用函数
直接用mlr3::resample替代resample,明确调用mlr3包中的函数:rr = mlr3::resample(task_penguins, learner, resampling)方式二:清理环境并重新加载mlr3verse
先卸载冲突的包,再重新加载mlr3verse:# 卸载可能冲突的包(示例为caret) detach("package:caret", unload = TRUE) # 重新加载mlr3verse library(mlr3verse) # 再次执行resample rr = resample(task_penguins, learner, resampling)额外建议
启动新的R会话,仅加载mlr3verse和palmerpenguins包,避免加载其他可能引发冲突的包,从根源上避免命名空间问题。
内容的提问来源于stack exchange,提问作者Henk
相关产品推荐
相关产品推荐

