On 2026-03-09 7:53 a.m., Tim Taylor wrote:
I appreciate there are likely many places where calling a stats function via 
`::` and without the stats package being loaded could be problematic but would 
R core have any interest in adapting functions to accommodate this where 
possible?

The example I ran in to today can be seen below:

ex <- function() {
     counts <- c(18,17,15,20,10,20,25,13,12)
     outcome <- gl(3,1,9)
     treatment <- gl(3,3)
     stats::glm(counts ~ outcome + treatment, family = "poisson")
}

tools::R(ex)
#>
#> Call:  stats::glm(formula = counts ~ outcome + treatment, family = "poisson")
#>
#> Coefficients:
#> (Intercept)     outcome2     outcome3   treatment2   treatment3
#>   3.045e+00   -4.543e-01   -2.930e-01    6.972e-16    8.237e-16
#>
#> Degrees of Freedom: 8 Total (i.e. Null);  4 Residual
#> Null Deviance:        10.58
#> Residual Deviance: 5.129  AIC: 56.76

tools::R(ex, env=c("R_DEFAULT_PACKAGES=NULL"))
#> Error: error in inferior call:
#>   object 'poisson' of mode 'function' was not found

The second call fails due to the following line in glm:

if (is.character(family))
         family <- get(family, mode = "function", envir = parent.frame())

A non-breaking patch (AFAICT) could add an additional branch that explicitly 
searches a lookup of functions in the stats package if the above call to `get` 
failed.

Again I understand this could very much be a case of, "don't do that", but ...

There are several other cases in stats where functions assume that a function name passed as a string can be found on the search list. They aren't always consistent about the search order:

C() searches for contr in the stats namespace first, as does make.tables.aovproj().

contrasts() does like glm() for family, it looks in the parent frame.
ks.test.default() likewise.

make.tables.aovprojlist() looks locally first, but doesn't restrict the search to functions.

I'm not sure I spotted all cases of this, and I didn't look in any other base packages besides stats.

So I think a patch to fix this should determine a consistent approach, and apply it everywhere. Maybe too big a can of worms?

Duncan Murdoch

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to