调用parsnip的linear_reg函数报错:找不到该函数对象
规范解决方案
解决这个问题的关键是明确指定命名空间调用parsnip函数,同时确保包依赖声明正确:
在DESCRIPTION里写对依赖
把parsnip加到Imports字段(如果只是在函数内部调用的话),示例:Imports: parsnip, purrr在函数里安全获取parsnip函数
别用match.fun或者不加限制的get(),改用getFromNamespace()明确指定从parsnip命名空间取函数,这样devtools检查时能准确找到函数位置。修改你的pmap调用部分:# 假设你是通过字符串(比如"linear_reg")来指定函数 purrr::pmap(your_param_list, function(func_name, ...) { # 明确从parsnip命名空间获取函数 reg_func <- getFromNamespace(func_name, ns = "parsnip") reg_func(...) %>% parsnip::set_engine("lm") })
如果是直接调用已知的parsnip函数(比如linear_reg),更简单——直接写parsnip::linear_reg()就行,不用绕弯子找函数。
为啥之前的方法不管用?
match.fun()在devtools的严格检查环境里,只会搜当前环境和全局环境,不会自动找导入的包命名空间里的函数,所以找不到linear_reg。loadNamespace("parsnip")只是加载了包的命名空间,但没把函数暴露到当前环境,所以match.fun还是找不到。- 用
get()能跑是因为交互式环境里你可能已经加载了parsnip,但devtools检查是在干净环境里跑的,而且get()如果不指定环境,万一全局有同名函数会搞混,不安全也不可靠。
验证修改
改完之后重新跑devtools::check(),应该就能解决找不到对象的错误了。记得所有parsnip相关的函数调用,要么加parsnip::前缀,要么用getFromNamespace()安全获取。
附:用户提供的相关信息
函数代码
fast_regression_parsnip_spec_tbl <- function(...) { purrr::pmap(list(...), function(func_name, ...) { func <- match.fun(func_name) func(...) %>% parsnip::set_engine("lm") }) %>% dplyr::bind_rows() }
错误回溯
Error in match.fun(func_name) : object 'linear_reg' of mode 'function' was not found
会话信息
sessionInfo() R version 4.3.1 (2023-06-16) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 22.04.3 LTS Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C time zone: Etc/UTC tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] parsnip_1.1.1 purrr_1.0.2 dplyr_1.1.3 loaded via a namespace (and not attached): [1] gtable_0.3.4 xfun_0.40 ggplot2_3.4.4 lattice_0.22-5 vctrs_0.6.4 [6] tools_4.3.1 generics_0.1.3 tibble_3.2.1 fansi_1.0.5 pkgconfig_2.0.3 [11] Matrix_1.6-1.1 lifecycle_1.0.3 compiler_4.3.1 munsell_0.5.0 carData_3.0-5 [16] codetools_0.2-19 htmltools_0.5.6.1 car_3.1-2 pillar_1.9.0 nnet_7.3-19 [21] MASS_7.3-60 tidyselect_1.2.0 digest_0.6.33 rpart_4.1.21 grid_4.3.1 [26] colorspace_2.1-0 cli_3.6.1 magrittr_2.0.3 survival_3.5-7 utf8_1.2.3 [31] broom_1.0.5 splines_4.3.1 backports_1.4.1 scales_1.2.1 stats4_4.3.1 [36] rmarkdown_2.25 minqa_1.2.6 lava_1.7.3 nloptr_2.0.3 evaluate_0.22 [41] knitr_1.44 hardhat_1.3.0 fastmap_1.1.1 modelr_0.1.11 multcomp_1.4-25 [46] rlang_1.1.1 globals_0.16.2
完整devtools检查日志
── R CMD check results ── yourpackage 0.1.0 ────────────────────────────────────
Duration: 1m 23s❯ checking R code for possible problems ... ERROR
Found the following errors:
Error in match.fun(func_name) :
object 'linear_reg' of mode 'function' was not found
Calls: fast_regression_parsnip_spec_tbl ...-> pmap_ -> .f -> match.fun
Execution halted
内容的提问来源于stack exchange,提问作者MCP_infiltrator

