On 05/07/2018 5:22 AM, David Hugh-Jones wrote:

Wow, this is extremely helpful. I've applied Joris' patch. By the way, the github master has the change that I stopped exporting methods, as per Hadley's suggestion; this caused *all* functions created via make_getter_setters to fail. Version 4.0.1 on CRAN has the methods exported, which was masking the error in most cases. I don't know why bold() was failing in certain cases only... in any case, the patch seems to fix things.


That's a roxygen2 bug or misuse. If you use the code below without the roxygen2 processing, and manually build the NAMESPACE file as

export(foo)
S3method(foo, bar)

then things are fine. I don't know roxygen2 well enough to know what else you should have done to get your NAMESPACE file to look like that.

Duncan Murdoch


Here is a brief test case that shows the original problem. I don't know whether this reveals any problem in base R:

# in package mypackage:
#' @export
foo <- function (x, ...) UseMethod('foo')
make_a_method <- function () assign("foo.bar", function (x, ...) cat("In foo.bar"), pos = getNamespace('mypackage'))
make_a_method()

# in the console:
library(mypackage)
mypackage:::foo.bar
## function (x, ...) cat("In foo.bar")
## <bytecode: 0x109a0ab80>
## <environment: 0x109a0ba28>
x <- structure(1, class='bar')
foo(x)
## Error in UseMethod("foo") :
##  no applicable method for 'foo' applied to an object of class "bar"

Also, I know I shouldn't be using @s3method ... it's on the TODO list... !

Cheers,
David


On Thu, 5 Jul 2018 at 09:07, Iñaki Úcar <i.uca...@gmail.com <mailto:i.uca...@gmail.com>> wrote:

    El mié., 4 jul. 2018 a las 22:47, Duncan Murdoch
    (<murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>>) escribió:
     >
     > On 04/07/2018 4:04 PM, Joris Meys wrote:
     > >
     > >
     > > On Wed, Jul 4, 2018 at 9:31 PM, Duncan Murdoch
    <murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>
     > > <mailto:murdoch.dun...@gmail.com
    <mailto:murdoch.dun...@gmail.com>>> wrote:
     > >
     > >
     > >     That shouldn't matter.  That function was created in a local
     > >     environment whose parent is <environment: namespace:huxtable>
     > >     (probably by the huxtable:::make_setter_getters function, but I
     > >     didn't check).
     > >
     > >     Duncan Murdoch
     > >
     > > I would think it does matter. Methods are found on the search
    path, but
     > > the environment where the methods are defined is not on the
    search path.
     > > It's a child environment of the namespace, and hence cannot be
    reached
     > > from either the global environment or the namespace if I
    understood it
     > > correctly.
     > >
     >
     > The environment of a function is where it looks for objects, not
    where
     > it is stored.  That method is stored in the huxtable namespace, and
     > exported from it.  That's why
     > getFromNamespace("align.huxtable","huxtable") (or even
     > huxtable::align.huxtable) finds it.
     >
     > I don't know the source of the original error.

    I don't know either. But obviously it has something to do with the
    function environment and how UseMethod looks for methods when they are
    exported from a namespace (I tested a similar "layout" in the global
    environment and the method is correctly found). So maybe this thread
    belongs to r-devel instead.

    Iñaki

     >
     > Duncan Murdoch
     >

    ______________________________________________
    R-package-devel@r-project.org <mailto:R-package-devel@r-project.org>
    mailing list
    https://stat.ethz.ch/mailman/listinfo/r-package-devel


______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to