【问题标题】:Export S3 method for a 'function' class object为“函数”类对象导出 S3 方法
【发布时间】:2023-03-13 08:01:01
【问题描述】:

函数对象似乎与 S3 方法的调度配合得很好。
但由于某种原因,它们无法在 NAMESPACE 文件中导出。

以下代码适用于调度到*.function 方法:

as.abc = function(x, ...){
    UseMethod("as.abc")
}
as.abc.list = function(x, ...){
    stopifnot(is.list(x))
    structure(x, class="abc")
}
as.abc.function = function(x, ...){
    stopifnot(is.function(x))
    structure(x, class="abc")
}
# list
l = as.abc(list(1))
str(l)
#List of 1
# $ : num 1
# - attr(*, "class")= chr "abc"

# function
f = as.abc(function(x) x)
str(f)
#function (x)  
# - attr(*, "srcref")=Class 'srcref'  atomic [1:8] 1 12 1 24 12 24 1 1
# .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x3dbb848> 
# - attr(*, "class")= chr "abc"

但是当我尝试将 NAMESPACE 中的导出定义为:

export(as.abc)
S3method(as.abc, list)
S3method(as.abc, function)

R CMD 检查时抛出错误

* checking package namespace information ... ERROR
Invalid NAMESPACE file, parsing gives:
Error in parse(nsFile, keep.source = FALSE, srcfile = NULL): 29:26: unexpected ')'
28: S3method(as.abc, list)
29: S3method(as.abc, function)

我也试过换成`,但也没有用

S3method(as.abc, `function`)

导出函数类方法的正确方法是什么?

【问题讨论】:

  • 尝试常规报价。从“编写 R 扩展”手册中,您将在 1.5.2 节中找到以下内容:“(请注意,函数和类名称可能会被引用,保留字和非标准名称(例如 [
  • 感谢@Chris,它确实有效。请把它作为答案,以便我接受。

标签: r devtools r-package r-s3


【解决方案1】:

根据Writing R Extensions 1.5.2 节,在注册适用于类函数对象的 S3 方法时,您必须使用正则引号:

(注意函数名和类名可以加引号,保留字和非标准名称如[

【讨论】:

  • 只是为了明确我的示例的直接解决方案是:S3method(as.abc, "function")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多