作者:luhd88112010_254 | 来源:互联网 | 2023-05-22 09:17
我有一个函数,他的任务是在父对象中创建一个变量.我想要的是函数在它被调用的级别创建变量.
createVariable <- function(var.name, var.value) {
assign(var.name,var.value,envir=parent.frame())
}
# Works
testFunc <- function() {
createVariable("testVar","test")
print(testVar)
}
# Doesn't work
testFunc2 <- function() {
testFunc()
print(testVar)
}
> testFunc()
[1] "test"
> testFunc2()
[1] "test"
Error in print(testVar) : object 'testVar' not found
我想知道在没有在全局环境范围内创建变量的情况下是否有任何方法可以做到这一点.
编辑:是否还有一种方法可以对已创建变量进行单元测试?
1> NicE..:
试试这个:
createVariable <- function(var.name, var.value) {
assign(var.name,var.value,envir=parent.env(environment()))
}
编辑:此处和此处提供更多详细信息.使用初始解决方案,变量在全局parent.env
环境中创建,因为定义函数的环境和createVariable
在全局环境中定义函数.
您可能还想尝试assign(var.name,var.value,envir=as.environment(sys.frames()[[1]]))
,这将createVariable
在您的示例中调用的最高测试函数(调用堆栈中的第一个)中创建它,在这种情况下,您将需要在调用时删除print(testVar)
,因为该变量仅在环境,而不是.我不知道这是不是你的意思.testFunc
testFunc2
testFunc2
testFunc
at the level at which it's called
如果你运行这个:
createVariable <- function(var.name, var.value) {
assign(var.name,var.value,envir=as.environment(sys.frames()[[1]]))
print("creating")
}
testFunc <- function() {
createVariable("testVar","test")
print("func1")
print(exists("testVar"))
}
testFunc2 <- function() {
testFunc()
print("func2")
print(exists("testVar"))
}
testFunc()
testFunc2()
你得到
> testFunc()
[1] "creating"
[1] "func1"
[1] TRUE
> testFunc2()
[1] "creating"
[1] "func1"
[1] FALSE
[1] "func2"
[1] TRUE
这意味着testVar
在testFun2
环境中,而不是在环境中testFunc
.像其他人所说的创建新环境可能更安全.