Hi Dirk, Thanks for the solution. Now I know the work-arounds, but still don't quite get it. Why does R_DEFAULT_PACKAGES has anything to do with library(methods)? If library(h5) works, it should just work, not depend on an environment variable. Rscript is not consistent with R, that's my confusion. Steve 2017-12-26 20:46 GMT+08:00 Dirk Eddelbuettel <edd at debian.org>:> > On 26 December 2017 at 15:24, Sun Yijiang wrote: > | After looking into C source code, I found that Rscript by default fills > | environment variable R_DEFAULT_PACKAGES with > | "datasets,utils,grDevices,graphics,stats", and it somehow fails some > | package like h5. > | > | The problem here is, not setting R_DEFAULT_PACKAGES is equivalent to > | setting it to a magic value, it's really confusing. I suggest remove > this > | feature. > > The more confusing part is that "methods" is missing 'by design' (as > loading > methods is marginally more expensive that other packages). Ie for your > script > > edd at bud:/tmp$ cat h5ex.R > library(methods) > library(h5) > name <- tempfile() > f <- h5file(name) > file.remove(name) > edd at bud:/tmp$ Rscript h5ex.R > [1] TRUE > edd at bud:/tmp$ > > it all works if you just add `library(methods)` as seen in the first line. > > For what it is worth, littler's r does not need that as it loads methods > just > like R itself does avoiding the confusion: > > edd at bud:/tmp$ cat h5ex2.R > library(h5) > name <- tempfile() > f <- h5file(name) > file.remove(name) > edd at bud:/tmp$ r h5ex2.R > edd at bud:/tmp$ > > Dirk > > -- > http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org >[[alternative HTML version deleted]]
Dirk Eddelbuettel
2017-Dec-26 14:40 UTC
[Rd] Rscript fails with some packages (for example, h5)
On 26 December 2017 at 22:14, Sun Yijiang wrote: | Thanks for the solution. Now I know the work-arounds, but still don't | quite get it. Why does R_DEFAULT_PACKAGES has anything to do with | library(methods)? Because it governs which packages are loaded by default. And while R also loads 'methods', Rscript does not. Source of endless confusion. | If library(h5) works, it should just work, not depend on an environment variable. Every package using S4 will fail under Rscript unless 'methods' explicitly. | Rscript is not consistent with R, that's my confusion. Indeed. And you are not the first person confused by it. Dirk -- http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
Duncan Murdoch
2017-Dec-27 11:13 UTC
[Rd] Rscript fails with some packages (for example, h5)
On 26/12/2017 9:40 AM, Dirk Eddelbuettel wrote:> > On 26 December 2017 at 22:14, Sun Yijiang wrote: > | Thanks for the solution. Now I know the work-arounds, but still don't > | quite get it. Why does R_DEFAULT_PACKAGES has anything to do with > | library(methods)? > > Because it governs which packages are loaded by default. And while R also > loads 'methods', Rscript does not. Source of endless confusion.Mostly irrelevant correction of the jargon: that setting controls which packages are "attached" by default. library(h5) would be enough to load methods, because h5 imports things from methods. But loading doesn't put a package on the search list. library(methods) both loads methods (if it hasn't already been loaded), and attaches it.> > | If library(h5) works, it should just work, not depend on an environment variable. > > Every package using S4 will fail under Rscript unless 'methods' explicitly.That's not quite true (or quite English, as per fortune(112)). The "gmp" package imports methods, and it works in Rscript. What doesn't work is to expect library(h5) or library(gmp) to cause methods functions like show() to be available to the user. There is a way to do that, but it is discouraged nowadays. My ancient package "orientlib" depends on methods, and that forces methods to be attached so show() works in Rscript. ("Depends" is used in the DESCRIPTION file sense.) h5 doesn't "depend" on methods, it "imports" methods.> > | Rscript is not consistent with R, that's my confusion. > > Indeed. And you are not the first person confused by it.And that's still true, and less irrelevant than my corrections. Duncan Murdoch