R 从打包函数本身获取其属性

R 从打包函数本身获取其属性,r,namespaces,package,environment,attr,R,Namespaces,Package,Environment,Attr,假设我们在R包中有这个函数 prova <- function() { print(attr(prova, 'myattr')) print(myattr(prova)) invisible(TRUE) } 'myattr<-' <- function(x, value) { attr(x, 'myattr') <- value x } myattr <- function(x) attr(x, 'myattr') prova您可以将get与e

假设我们在
R
包中有这个函数

prova <- function() {
  print(attr(prova, 'myattr'))
  print(myattr(prova))
  invisible(TRUE)
}
'myattr<-' <- function(x, value) {
  attr(x, 'myattr') <- value
  x
}
myattr <- function(x) attr(x, 'myattr')

prova您可以将
get
envir
参数一起使用

prova <- function() {

  print(attr(get("prova", envir=envir.prova), 'myattr'))
  print(myattr(prova))
  invisible(TRUE)
}
正如你所看到的,这并不复杂,但它是“乏味的”,有时似乎是一个虫子爬进来,这只是忘记携带n


因此,我更喜欢使用带有环境名称的固定变量

您可以将
get
envir
参数一起使用

prova <- function() {

  print(attr(get("prova", envir=envir.prova), 'myattr'))
  print(myattr(prova))
  invisible(TRUE)
}
正如你所看到的,这并不复杂,但它是“乏味的”,有时似乎是一个虫子爬进来,这只是忘记携带n


因此,我更喜欢使用带有环境名称的固定变量

我找到的解决方案是:

myattr <- function(x) attr(x, 'myattr')

'myattr<-' <- function(x, value) {
  # check that x is a function (e.g. the prova function)
  # checks on value (e.g. also value is a function with a given precise signature)
  attr(x, 'myattr') <- value
  x
}

prova <- function(..., env = parent.frame()) {
  # get the current function object (in its environment)
  this <- eval(match.call()[[1L]], env)
  # print(eval(as.call(c(myattr, this)), env)) # alternative
  print(myattr(this))
  # print(attr(this, 'myattr')

  invisible(TRUE)
}   
这样,如果传入正确的
pos
参数,则嵌套时它也可以工作

通过此修改,可以更轻松地找到在函数
prova
上设置属性的环境

myfun1 <- function() {
  myattr(prova) <- function() print(FALSE)
  myfun2(n = 2)
}
myfun2 <- function(n) {
  prova(pos = n)
}
myfun1()

# function() print(FALSE)
# <environment: 0x22e8208>

myfun1我找到的解决方案是:

myattr <- function(x) attr(x, 'myattr')

'myattr<-' <- function(x, value) {
  # check that x is a function (e.g. the prova function)
  # checks on value (e.g. also value is a function with a given precise signature)
  attr(x, 'myattr') <- value
  x
}

prova <- function(..., env = parent.frame()) {
  # get the current function object (in its environment)
  this <- eval(match.call()[[1L]], env)
  # print(eval(as.call(c(myattr, this)), env)) # alternative
  print(myattr(this))
  # print(attr(this, 'myattr')

  invisible(TRUE)
}   
这样,如果传入正确的
pos
参数,则嵌套时它也可以工作

通过此修改,可以更轻松地找到在函数
prova
上设置属性的环境

myfun1 <- function() {
  myattr(prova) <- function() print(FALSE)
  myfun2(n = 2)
}
myfun2 <- function(n) {
  prova(pos = n)
}
myfun1()

# function() print(FALSE)
# <environment: 0x22e8208>

myfun1可能值得澄清:
get
ting属性和
print
ing属性是两件不同的事情。@RicardoSaporta我需要验证属性是否存在并获取其值。可能值得澄清:
get
ting属性和
print
ing属性是两件不同的事情事情。@RicardoSaporta我需要验证属性是否存在并获取其值。我觉得我们都接近解决方案;),即使,可能由于我的一些错误,您的解决方案对我不起作用。关于我的解决方案(现在我发布了),我完全陷入了这样的困境:因为那时你也必须跟踪电话并确保。。事实上,我不想让用户做任何其他事情,比如调用设置属性的函数​​取得了一些进步,学到了一些新东西。顺便说一句,我更新了我的答案,使其更完整,以备将来参考。然而,可能是我的错,但我无法让它与您的技术一起工作(即使用带有环境名称的固定变量)。明天我将再次尝试。@Leodo,尝试使用全局分配(带双制动器)
我想你已经误诊了这个问题:当你使用
myattr(prova)时,我觉得我们都接近解决方案;),即使,可能由于我的一些错误,您的解决方案对我不起作用。关于我的解决方案(现在我发布了),我完全陷入了这样的困境:因为那时你也必须跟踪电话并确保。。事实上,我不想让用户做任何其他事情,比如调用设置属性的函数​​取得了一些进步,学到了一些新东西。顺便说一句,我更新了我的答案,使其更完整,以备将来参考。然而,可能是我的错,但我无法让它与您的技术一起工作(即使用带有环境名称的固定变量)。明天我将再次尝试。@Leodo,尝试使用全局赋值(带双制动器)
我想你已经误诊了这个问题:当你使用
myattr(prova)时,函数
f
工作的原因是
myattr
的定义超出了它的范围。因此,当
myattr
开始查找
prova
时,它在
f
之前开始,因此从未看到
prova
对象是
f
的本地对象。当您从
f
内部调用
prova()
时,
()
会让
R
知道如何查找在
f
内部找不到的函数,从而搜索调用堆栈。如果使用
myattr的定义,函数
f
工作的原因是
myattr
的定义超出了它的范围。因此,当
myattr
开始查找
prova
时,它在
f
之前开始,因此从未看到
prova
对象是
f
的本地对象。当您从
f
内部调用
prova()
时,
()
会让
R
知道如何查找在
f
内部找不到的函数,从而搜索调用堆栈。如果您带来了
myattr的定义
myfun1 <- function() {
  myattr(prova) <- function() print(FALSE)
  myfun2(n = 2)
}
myfun2 <- function(n) {
  prova(pos = n)
}
myfun1()

# function() print(FALSE)
# <environment: 0x22e8208>