[Rd] stats::getInitial: requires the model to live in the stats namespace or above

Bill Dunlap w||||@mwdun|@p @end|ng |rom gm@||@com
Wed Jun 22 18:44:25 CEST 2022


Shouldn't the get()'s in stats:::getInitial.formula be looking in the
environment of the formula, not the environment of getInitial.formula?

--- selfStart.R (revision 82512)
+++ selfStart.R (working copy)
@@ -78,13 +79,19 @@
     switch (length(object),
             stop("argument 'object' has an impossible length"),
         {                              # one-sided formula
-           func <- get(as.character(object[[2L]][[1L]]))
+            if (!is.call(object[[2L]])) {
+                stop("Right-hand side of formula is not a call")
+            }
+           func <- get(as.character(object[[2L]][[1L]]), mode="function",
envir=environment(object))
            getInitial(func, data,
                       mCall = as.list(match.call(func, call =
object[[2L]])),
                        ...)
         },
         {                              # two-sided formula
-           func <- get(as.character(object[[3L]][[1L]]))
+            if (!is.call(object[[3L]])) {
+                stop("Right-hand side of formula is not a call")
+            }
+           func <- get(as.character(object[[3L]][[1L]]), mode="function",
envir=environment(object))
            getInitial(func, data,
                       mCall = as.list(match.call(func, call =
object[[3L]])),
                       LHS = object[[2L]], ...)

-Bill


On Wed, Jun 22, 2022 at 8:25 AM Ivan Krylov <krylov.r00t using gmail.com> wrote:

> Hello R-devel,
>
> Here's a corner case I've stumbled upon recently:
>
> local({
>         # Originally this was a package namespace, but a local
>         # environment also leads to failure
>         stopifnot(!identical(environment(), globalenv()))
>
>         # Make a self-starting model inside this private environment...
>         SSlinear <- selfStart(
>                 ~ a * x + b,
>                 function(mCall, data, LHS, ...) {
>                         xy <- sortedXyData(mCall[['x']], LHS, data)
>                         setNames(
>                                 coef(lm(y ~ x, xy)),
>                                 mCall[c('b', 'a')]
>                         )
>                 },
>                 c('a', 'b')
>         )
>
>         # ...and try to use it
>         x <- 1:100
>         y <- 100 + 5 * x + rnorm(length(x), sd = 10)
>         nls(y ~ SSlinear(x, a, b))
>         # error in get('SSlinear'): object not found
> })
>
> As a workaround, I'll just provide the starting values manually,
> but should this work?
>
> As implemented [1], getInitial requires the model object to live in the
> stats package namespace or any of its parents, which eventually include
> the global environment and the attached packages, but not the private
> namespaces of the packages or any other local environments. This
> results from the fact that getInitial() uses plain get() in order to
> resolve the symbol for the self-starting model, and get() defaults to
> the current environment, which leads a chain of stats -> imports:stats
> -> base -> global environment -> attached packages.
>
> It seems easy to suggest get(., envir = environment(object)) as a fix,
> which would be able to access anything available at the time of
> creation of the formula. On the other hand, it would break the case
> when the stats package is not attached to the global environment or the
> formula environment, which currently works.
>
> --
> Best regards,
> Ivan
>
> [1]
>
> https://github.com/r-devel/r-svn/blob/d43497cbc927e632c6f597fa23001c3f31d4cae6/src/library/stats/R/selfStart.R#L81-L87
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list