r - 带有 lapply 的内部 S3 泛型

标签 r oop lapply

我有一个 S3 通用函数,我希望它成为包的内部部分。如果可能的话,我宁愿不导出它。一个有趣的缺点是似乎 lapply无法找到或使用正确的 S3 方法。有谁知道这种行为背后的原因?下面是一个可重现的例子,它涉及从我的 github 安装一个虚拟包。

在这种情况下,通用函数是 docheck这将返回 TRUE如果对象是 "foo"FALSE否则。

library(remotes)
install_github("jtlandis/SOExample")
#> Skipping install of 'SOExample' from a github remote, the SHA1 (27ab918c) has not changed since last install.
#>   Use `force = TRUE` to force installation
library(SOExample)

foo 函数只是一个 NA带有 "foo" 的对象类。

foo
#> function () 
#> structure(NA, class = "foo")
#> <bytecode: 0x0000000015033878>
#> <environment: namespace:SOExample>

fun_success()仅显示内部(未导出)S3 函数起作用的情况。

fun_success
#> function (x) 
#> {
#>     docheck(x)
#> }
#> <bytecode: 0x0000000013f83100>
#> <environment: namespace:SOExample>

fun_success(foo())
#> [1] TRUE

fun_failure()调用相同的内部泛型方法,但失败

fun_failure
#> function (x) 
#> {
#>     lapply(list(x), docheck)
#> }
#> <bytecode: 0x0000000015e68df0>
#> <environment: namespace:SOExample>

fun_failure(foo())
#> Error in UseMethod("docheck"): no applicable method for 'docheck' applied to an object of class "foo"

reprex package 创建于 2021-07-24 (v2.0.0)

最佳答案

R 在确保正确注册 S3 方法方面变得越来越挑剔。注册包泛型方法的常规方法是使用 NAMESPACE 文件中的 S3method()。但是,如果您试图不导出所有 docheck,那么您需要自己注册 S3 方法。您可以使用 .S3method() 函数来做到这一点。在您的 R 文件中,添加这一行

# Existing line...
# docheck.foo <- function(x) T
# New line...
.S3method("docheck", "foo", docheck.foo)

这将允许 lapply 找到该方法。

关于r - 带有 lapply 的内部 S3 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68515108/

相关文章:

r - 在 R 中绘制 3x3 方格

java - java是否有一些约定来指示对象处于空状态?

java - Java中哪个线程负责什么

R中的Reduce()超过导致错误的相似变量名称

r - 是否可以跳过 "+"运算符中的 NA 值?

string - 如何将子功能应用于数据框?

r - 使用 Rtools/MinGW 编译 Armadillo

r - 如何将序列拆分为 k 个同质部分?

javascript - 如何从子调用父方法

r - 向 ggplot 添加图例 - 颜色名称无效