在构建软件包时,函数的调用环境中有哪些可用的东西?

时间:2016-11-30 11:39:55

标签: r package

当我尝试为我构建的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

任何有关此处发生的事情的想法或指示都将非常感激 - 无论哪种方式,感谢阅读!

0 个答案:

没有答案