【发布时间】:2014-06-20 23:39:32
【问题描述】:
我从来没有完全理解嵌套函数和通过引用传递参数。我的策略通常是在子函数中执行类似get('variabletopassbyreference') 的操作来完成此操作。
到目前为止,我一直在将全局变量传递给函数,并且效果很好。今天我尝试在函数内创建局部变量,然后将它们传递给该函数内的嵌套函数,但失败了。我无法让get 工作。我还尝试修改 pos 和 inherits 但无济于事。
我在网上找不到确切的答案。如果我可以让这个构造工作,那么这就是我的偏好,因为我有很多其他的函数,我已经以类似的方式编写了代码。如果我根本不应该这样做而应该做其他事情,那么这些信息也会受到赞赏。
下面是一个例子-
test1 <- function(a1,b1) {
# cat(ls()) # a1 b1
# cat(ls(pos = 1)) # c test1 test2
testvalue <- get('c') * get(a1, inherits = TRUE) * get(b1)
testvalue
}
test2 <- function() {
a = 1
b <- 2
# cat(ls()) # a b
test1('a','b')
}
c = 3
test2()
我收到以下错误 -
Error in get(a1, inherits = TRUE) : object 'a' not found
更通用的示例 -
a = 0
test1 <- function(a1,b1) {
# cat(ls()) # a1 b1
# cat(ls(pos = 1)) # c test1 test2
testvalue <- get('c') * a1 * b1
assign(x = 'a', value = 2.5)
assign(x = 'a', value = 3.5, envir = parent.frame())
assign(x = 'a', value = 4.5, envir = .GlobalEnv)
cat(a)
cat(' - value of a local within test1\n')
testvalue
}
test2 <- function() {
a = 1
b <- 2
# cat(ls()) # a b
cat(a)
cat(' - value of a local within test2 before test1 called\n')
test1(a1 = a, b1 = b)
cat(a)
cat(' - value of a local within test2 after test1 called\n')
}
cat(a)
cat(' - value of a global before test 2 \n')
c = 3
test2()
cat(a)
cat(' - value of a global after test 2 \n')
【问题讨论】:
-
您为什么对通过引用传递感兴趣?
-
我假设按值传递会在内存中创建一个副本。在处理非常大的数据集时,这是我买不起的奢侈品。很少,我也需要在函数本身中修改对象。
-
事实并非如此。仅当您尝试修改参数时才会进行复制。这里详细讨论:stackoverflow.com/questions/15759117/…
-
那是很多文字,我要阅读它,但在我开始这段旅程之前 - 所以在上面的例子中,如果我也做了类似
assign(a1, 3)的事情,那么它会创建一个副本,但是否则就继续引用原来的a?然后我可以使用assign中的envir参数来修改全局变量本身。 -
恐怕
assign和get在同一个篮子里。这是一种可怕的方法。您现在是否正在尝试修改函数范围之外的对象?如果是这种情况,请让您的示例更通用,以便我可以帮助提供替代方案。也许你会对proto包感兴趣,它提供了一个简单的面向对象(通过引用)的设计。