函数粘贴至R控制台正常,加载自R包时出现找不到函数'.'错误
问题分析与解决方案
这个问题我遇到过类似的情况,核心原因是R包的命名空间机制、依赖配置以及非标准评估语法在包环境下的兼容性问题,咱们一步步拆解修复:
一、错误根源拆解
source()绝对路径在包中无效:你在函数里用source("C:/Users/Utente/.../dt_aggregate.R")加载自定义函数,但R包的文件路径是相对且受安装环境约束的,本地绝对路径在包安装后会失效,必须把dt_aggregate函数整合到包内部。.(...)语法的命名空间问题:.(是data.table对list()的别名,但在包的命名空间环境中,eval(parse(...))执行时无法自动识别这个非标准语法,导致找不到.函数。- 包内依赖管理不规范:函数内用
require()加载依赖的方式在包中不可靠,应该通过包的DESCRIPTION和NAMESPACE文件统一声明依赖,确保命名空间正确导入。
二、具体修复步骤
1. 重构包结构与依赖配置
- 把
dt_aggregate.R文件直接放到你的R包的R/目录下,这样包安装时会自动加载这个函数,彻底删掉source()语句。 - 修改包的
DESCRIPTION文件,添加依赖声明:Imports: data.table, dplyr, gridExtra, knitr, kableExtra - 如果用
roxygen2管理包,在每个函数上方添加标签自动生成NAMESPACE:
或者手动在#' @import data.table #' @import dplyr #' @importFrom knitr kable #' @importFrom kableExtra kable_styling row_spec #' @export tabellacon777 <- function(x){...}NAMESPACE中添加:import(data.table) import(dplyr) importFrom(knitr, kable) importFrom(kableExtra, kable_styling, row_spec) export(tabellacon777) export(dt_aggregate)
2. 修复dt_aggregate中的.(语法问题
把dt_aggregate里生成分组语句的部分,用标准的list()替代.(别名,避免非标准语法在包环境中的识别问题:
# 原代码 dims_to_run_ev=paste0(".(",paste(dims_to_run_i,collapse=","),")") # 修改为 dims_to_run_ev=paste0("list(",paste(dims_to_run_i,collapse=","),")")
同时删掉dt_aggregate开头的library(data.table),依赖已经通过包配置管理。
3. 简化tabellacon777函数
移除函数内的所有require()语句,依赖已经由包统一加载:
tabellacon777 <- function(x){ divper777 <- x %>% mutate(Tipo_Marchio = ifelse(Stagione!="P8", "Resi", ifelse(Magazzino.Logico!="77" & Magazzino.Fisico!="06", "FROM", ifelse(Magazzino.Logico=="77","Prima Linea 777","Prima Linea STD")))) resultcon777 <- dt_aggregate( divper777, by=.(Tipo_Marchio), by_all.(Tipo_Marchio), NumCapi = sum(Quantità), NumPrelievi = sum(complete.cases(Quantità)), MedCapiPre = round(mean(Quantità),1), OreDecimali = round(sum(ORE_DEC),1), CapiOra = round((sum(Quantità)/sum(ORE_DEC)),0), PrelieviOra = round((sum(complete.cases(Quantità))/sum(ORE_DEC)),0) ) options(knitr.table.format = "html") resultcon777 %>% kable("html") %>% kable_styling(bootstrap_options = c("striped", "hover","condensed"),full_width = F) %>% row_spec(5, bold = T, background = "#E3E3E3") }
三、测试验证
用devtools::load_all()加载你的包(而不是控制台直接粘贴函数),模拟真实的包加载环境,测试tabellacon777函数是否正常运行。
内容的提问来源于stack exchange,提问作者Luca5om3
相关产品推荐
相关产品推荐

