I am trying to create a class union of class unions to facilitate method dispatch. When I execute code in the global environment, everything acts as expected, however when I put the same code in the context of a package, selectMethod can no longer find the correct method. This first block below puts the code in the context of a package:
fn <- "codefile.R" writeLines( c( "setClass('x', slots = list(slot ='character'))", "setClass('y', slots = list(slot ='character'))", "setClass('a', slots = list(slot ='character'))", "setClass('b', slots = list(slot ='character'))", "setClassUnion('xy', c('x', 'y'))", "setClassUnion('ab', c('a', 'b'))", "setClassUnion('xyab', c('xy', 'ab'))", "setGeneric('f', function(object, ...) standardGeneric('f'))", "setMethod('f', 'xyab', function(object, ...) print('hi!'))" ), con = fn ) package.skeleton(code_files = "codefile.R") system("rm -rf anRpackage/man") system("R CMD INSTALL anRpackage") library(anRpackage) ## fails in R 3.6.2, but works in R 3.5.0 f(new("a")) Next, if a fresh R 3.6.2 session is started and I execute the following at the prompt, method dispatch works as expected. setClass("x", slots = list(slot ="character")) setClass("y", slots = list(slot ="character")) setClass("a", slots = list(slot ="character")) setClass("b", slots = list(slot ="character")) setClassUnion("xy", c("x", "y")) setClassUnion("ab", c("a", "b")) setClassUnion("xyab", c("xy", "ab")) setGeneric("f", function(object, ...) standardGeneric("f")) setMethod("f", "xyab", function(object, ...) print("hi!")) ## print's "hi!" as expected f(new("a")) I have also posted to stack overflow here: https://stackoverflow.com/questions/60264786/r-s4-class-union-of-class-unions?noredirect=1#comment106627883_60264786, (the example in this note removes devtools to make the environment cleaner). Interestingly, the issue only seems to arise when there are > 1 layer of the class union. E.g. if I were to setMethod on "ab" instead of "xyab", method dispatch would work as expected. I am not posting a bug yet as it is still unclear to me if I am doing something incorrect. My sessionInfo() is : R version 3.6.2 (2019-12-12) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 18.04.3 LTS Matrix products: default BLAS: /usr/local/lib/R/lib/libRblas.so LAPACK: /usr/local/lib/R/lib/libRlapack.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] anRpackage_1.0 loaded via a namespace (and not attached): [1] compiler_3.6.2 tools_3.6.2 Thanks in advance for the help! [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel