On Feb 11, 2014, at 1:28 PM, Martin Morgan <mtmor...@fhcrc.org> wrote:
> On 02/11/2014 09:06 AM, Winston Chang wrote: >> To state the issue that Kirill raised in a different way... A package >> with S4 or reference classes and Depends:methods can throw an error >> when you do something as simple as this: >> Rscript -e "mypackage::foo()" >> >> But this will work: >> Rscript -e "library(mypackage); foo()" >> >> This is because when mypackage has Depends:methods, calling >> mypackage::foo() merely loads mypackage, and doesn't attach it -- and >> when this happens, the methods package is also loaded and not >> attached. In this situation, you can get errors of the type that Dirk >> noted. >> >> In contrast, library(mypackage) causes methods to be attached, and so >> you won't get those errors. This seems like a problem with the >> behavior of the :: operator. Why should it be that when a package is >> loaded, the packages listed in Depends are not attached? Because the whole point is that you don't want mypackage on the search path, otherwise you wouldn't use :: in the first place. Namespaces are about solving the namespace clutter, not exacerbating it ;). >> Presumably, >> when someone lists a package in Depends instead of Imports, it's for a >> good reason, as is the case here with the methods package. > > To me it's worth distinguishing between the particular problem associated > with the methods package, and the more general problem encountered when PkgA > fails to import symbols used in PkgB, and instead relies on PkgB symbols to > be found on the search path. In the latter it seems better practice to > import(PkgB) (or importFrom) in the NAMESPACE and probably Import: PkgB in > DESCRIPTION. > >> In the following thread, it's stated that the defensive approach is to >> use Depends:methods -- but that's still not enough for running the >> code listed above. >> http://r.789695.n4.nabble.com/advise-on-Depends-td4678930.html > > A more defensive defensive approach might be to add > > .onLoad <- function(...) require(methods) > But that will attach methods again - not good. I suspect the problem could be classified as bug in methods which doesn't behave correctly if not attached. I didn't look into details, but there used to be a technical problem in R C API where you could not pass the right environments to make that work (that bit me when I tried to use S4 a while ago), but I think that has been solved, so conceptually I think this is a bug that could be fixed. This sounds like something that should be possible to fix - even if it means fixing something in R to make it happen. Working around it in hacky ways mentioned here doesn't solve the underlying problem. Cheers, Simon > but this leads to either > > * checking dependencies in R code ... WARNING > 'library' or 'require' call not declared from: ‘methods’ > See the information on DESCRIPTION files in the chapter 'Creating R > packages' of the 'Writing R Extensions' manual. > ... > * checking R code for possible problems ... NOTE > File ‘PkgA/R/binding.R’: > .onLoad calls: > require(methods) > > Package startup functions should not change the search path. > See section ‘Good practice’ in '?.onAttach'. > > with Imports: methods, or > > * checking dependencies in R code ... NOTE > 'library' or 'require' call to ‘methods’ which was already attached by > Depends. > Please remove these calls from your code. > See the information on DESCRIPTION files in the chapter 'Creating R > packages' of the 'Writing R Extensions' manual. > ... > * checking R code for possible problems ... NOTE > File ‘PkgA/R/binding.R’: > .onLoad calls: > require(methods) > > Package startup functions should not change the search path. > See section ‘Good practice’ in '?.onAttach'. > > with Depends: methods > > So is there really any WARNING / NOTE-free way of using the methods package? > > Martin > >> >> -Winston >> >> >> On Mon, Feb 10, 2014 at 8:31 PM, Dirk Eddelbuettel <e...@debian.org> wrote: >>> >>> On 11 February 2014 at 02:53, Kirill Müller wrote: >>> | Why does it seem to be necessary to load the methods package here? >>> >>> "Just use littler (TM pending)". >>> >>> It (auto-)load methods automagically, thanks to Jeff Horner. See below. >>> >>> edd@max:~$ chmod 0755 /tmp/kirill.r >>> edd@max:~$ /tmp/kirill.r >>> [1] "refObjectGenerator" >>> attr(,"package") >>> [1] "methods" >>> edd@max:~$ cat /tmp/kirill.r >>> #!/usr/bin/r >>> >>> newTest <- function() { >>> cl <- get("someClass") >>> cl$new >>> } >>> >>> someClass <- setRefClass("someClass") >>> print(class(someClass)) >>> edd@max:~$ >>> >>> For Rscript, you still need to load it explicitly like any other packages >>> you >>> want to use. >>> >>> Dirk >>> >>> PS New littler release pending in a few days or weeks. The Github repo is >>> current and working. >>> >>> -- >>> Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >> >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > > -- > Computational Biology / Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N. > PO Box 19024 Seattle, WA 98109 > > Location: Arnold Building M1 B861 > Phone: (206) 667-2793 > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel