testFunc2() [1]-6ren">
gpt4 book ai didi

R 编程 - 在它被调用的环境中创建变量

转载 作者:行者123 更新时间:2023-12-04 11:32:03 26 4
gpt4 key购买 nike

我有一个函数,它的任务是在父对象中创建一个变量。我想要的是让函数在调用它的级别创建变量。

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

我想知道是否有任何方法可以在不在全局环境范围内创建变量的情况下做到这一点。

编辑:是否还有一种方法可以对已创建的变量进行单元测试?

最佳答案

尝试这个:

createVariable <- function(var.name, var.value) {
assign(var.name,var.value,envir=parent.env(environment()))
}

编辑:
更多详情 herehere .
使用初始解决方案,变量是在全局环境中创建的,因为 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

这意味着 testVartestFun2的环境,不在 testFunc的。像其他人所说的那样创建一个新环境可能更安全。

关于R 编程 - 在它被调用的环境中创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28504871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com