Duncan Murdoch
2024-Apr-11 13:06 UTC
[Rd] Repeated library() of one package with different include.only= entries
On 11/04/2024 7:04 a.m., Martin Maechler wrote:>>>>>> Michael Chirico >>>>>> on Mon, 8 Apr 2024 10:19:29 -0700 writes: > > > Right now, attaching the same package with different include.only= has no > > effect: > > > library(Matrix, include.only="fac2sparse") > > library(Matrix) > > ls("package:Matrix") > > # [1] "fac2sparse" > > > ?library does not cover this case -- what is covered is the _loading_ > > behavior of repeated calls: > > >> [library and require] check and update the list of currently attached > > packages and do not reload a namespace which is already loaded > > > But here we're looking at the _attach_ behavior of repeated calls. > > > I am particularly interested in allowing the exports of a package to be > > built up gradually: > > > library(Matrix, include.only="fac2sparse") > > library(Matrix, include.only="isDiagonal") # want: ls("package:Matrix") --> > > c("fac2sparse", "isDiagonal") > > ... > > > It seems quite hard to accomplish this at the moment. Is the behavior to > > ignore new inclusions intentional? Could there be an argument to get > > different behavior? > > As you did not get an answer yet, ..., some remarks by an > R-corer who has tweaked library() behavior in the past : > > - The `include.only = *` argument to library() has been a > *relatively* recent addition {given the 25+ years of R history}: > > It was part of the extensive new features by Luke Tierney for > R 3.6.0 [r76248 | luke | 2019-03-18 17:29:35 +0100], with NEWS entry > > ? library() and require() now allow more control over handling > search path conflicts when packages are attached. The policy is > controlled by the new conflicts.policy option. > > - I haven't seen these (then) new features been used much, unfortunately, > also not from R-core members, but I'd be happy to be told a different story. > > > For the above reasons, it could well be that the current > implementation {of these features} has not been exercised a lot > yet, and limitations as you found them haven't been noticed yet, > or at least not noticed on the public R mailing lists, nor > otherwise by R-core (?). > > Your implicitly proposed new feature (or even *changed* > default behavior) seems to make sense to me -- but as alluded > to, above, I haven't been a conscious user of any > 'library(.., include.only = *)' till now.I don't think it makes sense. I would assume that library(Matrix, include.only="isDiagonal") implies that only `isDiagonal` ends up on the search path, i.e. "include.only" means "include only", not "include in addition to whatever else has already been attached". I think a far better approach to solve Michael's problem is simply to use fac2sparse <- Matrix::fac2sparse isDiagonal <- Matrix::isDiagonal instead of messing around with the user's search list, which may have been intentionally set to include only one of those. So I'd suggest changing the docs to say "[library and require] check and update the list of currently attached packages and do not reload a namespace which is already loaded. If a package is already attached, no change will be made." Duncan Murdoch
iuke-tier@ey m@iii@g oii uiow@@edu
2024-Apr-11 14:37 UTC
[Rd] [External] Re: Repeated library() of one package with different include.only= entries
On Thu, 11 Apr 2024, Duncan Murdoch wrote:> On 11/04/2024 7:04 a.m., Martin Maechler wrote: >>>>>>> Michael Chirico >>>>>>> on Mon, 8 Apr 2024 10:19:29 -0700 writes: >> >> > Right now, attaching the same package with different include.only= >> has no >> > effect: >> >> > library(Matrix, include.only="fac2sparse") >> > library(Matrix) >> > ls("package:Matrix") >> > # [1] "fac2sparse" >> >> > ?library does not cover this case -- what is covered is the >> _loading_ >> > behavior of repeated calls: >> >> >> [library and require] check and update the list of currently >> attached >> > packages and do not reload a namespace which is already loaded >> >> > But here we're looking at the _attach_ behavior of repeated calls. >> >> > I am particularly interested in allowing the exports of a package to >> be >> > built up gradually: >> >> > library(Matrix, include.only="fac2sparse") >> > library(Matrix, include.only="isDiagonal") # want: >> ls("package:Matrix") --> >> > c("fac2sparse", "isDiagonal") >> > ... >> >> > It seems quite hard to accomplish this at the moment. Is the >> behavior to >> > ignore new inclusions intentional? Could there be an argument to get >> > different behavior? >> >> As you did not get an answer yet, ..., some remarks by an >> R-corer who has tweaked library() behavior in the past : >> >> - The `include.only = *` argument to library() has been a >> *relatively* recent addition {given the 25+ years of R history}: >> >> It was part of the extensive new features by Luke Tierney for >> R 3.6.0 [r76248 | luke | 2019-03-18 17:29:35 +0100], with NEWS entry >> >> ? library() and require() now allow more control over handling >> search path conflicts when packages are attached. The policy is >> controlled by the new conflicts.policy option. >> >> - I haven't seen these (then) new features been used much, unfortunately, >> also not from R-core members, but I'd be happy to be told a different >> story. >> >> For the above reasons, it could well be that the current >> implementation {of these features} has not been exercised a lot >> yet, and limitations as you found them haven't been noticed yet, >> or at least not noticed on the public R mailing lists, nor >> otherwise by R-core (?). >> >> Your implicitly proposed new feature (or even *changed* >> default behavior) seems to make sense to me -- but as alluded >> to, above, I haven't been a conscious user of any >> 'library(.., include.only = *)' till now. > > I don't think it makes sense. I would assume that > > library(Matrix, include.only="isDiagonal") > > implies that only `isDiagonal` ends up on the search path, i.e. > "include.only" means "include only", not "include in addition to whatever > else has already been attached". > > I think a far better approach to solve Michael's problem is simply to use > > fac2sparse <- Matrix::fac2sparse > isDiagonal <- Matrix::isDiagonal > > instead of messing around with the user's search list, which may have been > intentionally set to include only one of those. > > So I'd suggest changing the docs to say > > "[library and require] check and update the list of currently attached > packages and do not reload a namespace which is already loaded. If a package > is already attached, no change will be made."?library could also mention using detach() followed by library() or attachNamespace() with a new include.only specification. Best, luke> > Duncan Murdoch > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu/