当我尝试为我构建的R包中的某些函数添加特定属性时,我遇到了一个非常奇怪的问题。
基本上,我希望添加一个属性,其中包含要调用函数的所有类。这可以手动指定,或者这是棘手的部分,可以通过查找该函数可用的方法来完成。
我可以通过编写像
这样的东西来做到这一点foo <- function(x) UseMethod("foo")
foo.character <- function(x) x
foo.numeric <- function(x) x + 1
makeAttributedFunction <- function(fName, classes = NULL) {
if (is.null(classes)) {
theseMethods <- as.character(methods(fName))
if (length(theseMethods) > 0) {
classes <- sub(paste(fName, ".", sep=""),
"", theseMethods)
} else classes <- character()
}
f <- get(fName)
attr(f, "classes") <- classes
class(f) <- "attributedFunction"
f
}
foo <- makeAttributedFunction("foo")
在我直接在控制台中运行时效果很好,然后就可以了
> foo
function (x)
UseMethod("foo")
attr(,"classes")
[1] "character" "numeric"
attr(,"class")
[1] "attributedFunction"
但是,如果我在包中包含的脚本中执行此操作,则makeAttributedFunction()
似乎无法再找到与foo()
关联的方法。现在,调用foo
(在fooPack
包中)会返回
> fooPack:::foo
function (x)
UseMethod("foo")
<bytecode: 0x0000000019ec7100>
<environment: namespace:fooPack>
attr(,"classes")
character(0)
attr(,"class")
[1] "attributedFunction"
通过在browser()
中添加makeAttributedFunction()
行并从check()
调用devtools
函数,我尝试了一下构建程序包时环境中可用内容的一瞥。这允许我调试makeAttributedFunction()
,但我并不确定它是否在&#34;右边&#34;环境,它并没有真正帮助我。以下是我尝试过的一些事情:
Browse[1]> fName
[1] "foo"
Browse[1]> methods(fName)
no methods found
Browse[1]> get(fName)
function(x) UseMethod("foo")
<environment: namespace:fooPack>
Browse[1]> foo.character
function(x) x
<environment: namespace:fooPack>
Browse[1]> foo.numeric
function(x) x + 1
<environment: namespace:fooPack>
Browse[1]> isS3method("foo.numeric")
[1] TRUE
Browse[1]> parent.env(as.environment(-1L))
<environment: namespace:fooPack>
Browse[1]> ls(parent.env(as.environment(-1L))) #all objects in the namespace of fooPack
[15] "foo"
[16] "foo.character"
[17] "foo.numeric"
[18] "makeAttributedFunction"
Browse[1]> .S3methods("foo", envir = parent.env(as.environment(-1L)))
no methods found
任何有关此处发生的事情的想法或指示都将非常感激 - 无论哪种方式,感谢阅读!