[R-pkg-devel] Extending proj with proj.line3d methods and overloading the methods
Ivan Krylov
|kry|ov @end|ng |rom d|@root@org
Sat Apr 27 09:08:57 CEST 2024
27 апреля 2024 г. 00:49:47 GMT+03:00, Leo Mada via R-package-devel <r-package-devel using r-project.org> пишет:
>Dear List-Members,
>
>I try to implement a proj.line3d method and to overload this method as follows:
>
>proj.line3d <- function(p, x, y, z, ...)
> UseMethod("proj.line3d")
>
>proj.line3d.numeric = function(p, x, y, z, ...) {
> # ...
>}
>
>proj.line3d.matrix = function(p, x, y, z, ...) {
> # ...
>}
>p = c(1,2,3)
>line = matrix(c(0,5,2,3,1,4), 2)
>proj.line3d(p, line)
># Error in UseMethod("proj.line3d") :
># no applicable method for 'proj.line3d' applied to an object of class "c('double', 'numeric')"
>methods(proj)
># [1] proj.aov* proj.aovlist* proj.default* proj.line3d
># [5] proj.line3d.matrix proj.line3d.numeric proj.lm
In your NAMESPACE, you've registered methods for the generic function 'proj', classes 'line3d.matrix' and 'line3d.numeric', but above you are calling a different generic, 'proj.line3d', for which no methods are registered.
For proj.line3d(<numeric>, <matrix>) to work, you'll have to register the methods for the proj.line3d generic. If you need a visible connection to the proj() generic, you can try registering a method on the 'proj' generic, class 'line3d' *and* creating a class 'line3d' that would wrap your vectors and matrices:
proj(line3d(p), line) -> call lands in proj.line3d -> maybe additional dispatch on the remaining classes of 'p'?
This seems to work, but I haven't tested it extensively:
> proj.line3d <- \(x, ...) UseMethod('proj.line3d')
> proj.line3d.numeric <- \(x, ...) { message('proj.line3d.numeric'); x }
> line3d <- \(x) structure(x, class = c('line3d', class(x)))
> proj(line3d(pi))
proj.line3d.numeric
[1] 3.141593
attr(,"class")
[1] "line3d" "numeric"
--
Best regards,
Ivan
More information about the R-package-devel
mailing list