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>