我对阅读gamm4包的源代码时注意到的一个事实感到困惑。
\n它在两个地方从mgcv导入内部函数。
\n一处位于函数中(此处gamm4.setup链接到代码)
G <- mgcv:::gam.setup(formula,pterms,\n data=data,knots=knots,sp=NULL,\n min.sp=NULL,H=NULL,absorb.cons=TRUE,sparse.cons=0,gamm.call=TRUE)\nRun Code Online (Sandbox Code Playgroud)\n另一个地方是 gamm4 函数(此处链接到代码):
\n var.summary <- mgcv:::variable.summary(gp$pf,dl,nrow(mf)) ## summarize the input data\nRun Code Online (Sandbox Code Playgroud)\n在描述文件中,它在“取决于”下列出了 mgcv(在此处链接到完整的描述文件):
\nDepends: R (>= 2.9.0), methods, Matrix, lme4 (>= 1.0), mgcv (>= 1.7-23)\nRun Code Online (Sandbox Code Playgroud)\n此外,在 NAMESPACE 中它导入了 mgcv,尽管我认为这与我的问题无关。此处链接到命名空间。
\n如果我在正在开发的包中执行完全相同的操作,则使用另一个包中的内部函数会导致警告,并留下以下警告R CMD check:
\xe2\x9d\xaf checking dependencies in R code ... WARNING\n Unexported objects imported by \':::\' calls:\n \xe2\x80\x98mgcv:::gam.setup\xe2\x80\x99 \xe2\x80\x98mgcv:::variable.summary\xe2\x80\x99\n …Run Code Online (Sandbox Code Playgroud) 我正在使用dplyr group_by和summarise使用自定义聚合函数,并观察到一个奇怪的行为.看起来每个组的聚合函数评估两次.
这是一个最小的例子:
aggFun <- function(x) { print("Inside function"); print(rnorm(1)); sum(x)}
df <- data.frame(key = rep("a", 3), val = 1:3)
df %>% group_by(key) %>% summarise(sum = aggFun(val))
Run Code Online (Sandbox Code Playgroud)
输出如下:
[1] "Inside function"
[1] 0.3230769
[1] "Inside function"
[1] -0.3347653
# A tibble: 1 × 2
key sum
<fctr> <int>
1 a 6
Run Code Online (Sandbox Code Playgroud)
既然只有一个组,那么该函数不应只评估一次吗?我在大型应用程序中遇到同样的事情,并担心这可能对性能有害,或者我错过了什么?
通过升级到GitHub版本解决.