索引函数数组的奇怪R行为

索引函数数组的奇怪R行为,r,function,lambda,R,Function,Lambda,我在R函数数组中遇到了一些意想不到的行为,我将问题简化为一个最小的工作示例: theory = c(function(p) p) i = 1 posterior = function(p) theory[[i]](p) i = 2 posterior(0) 这给了我一个错误,说下标i超出范围 所以我猜I在posterior的定义中被用作一个“自由”变量,所以当我重新定义I时,它会被更新。奇怪的是,这是有效的: theory = c(function(p) p) i = 1 posteri

我在R函数数组中遇到了一些意想不到的行为,我将问题简化为一个最小的工作示例:

theory = c(function(p) p)

i = 1
posterior = function(p) theory[[i]](p)
i = 2

posterior(0)
这给了我一个错误,说下标
i
超出范围

所以我猜
I
posterior
的定义中被用作一个“自由”变量,所以当我重新定义
I
时,它会被更新。奇怪的是,这是有效的:

theory = c(function(p) p)

i = 1
posterior = theory[[i]]
i = 2

posterior(0)

我怎样才能避免这种情况?请注意,不重新定义
i
不是一个选项,因为这些东西将进入一个for循环,其中
i
是索引。

这不起作用的原因是,您重新定义了
i=2
,然后您就超出了理论的范围,它包含一个元素。函数的计算是惰性的,因此它只在调用函数时执行
theory[[i]]
,此时
i
等于2


您可以阅读更多关于懒惰评估的内容。

这里不清楚您想要实现什么。该错误是由于引用了函数中不存在的索引,而该索引是预期的。你的函数所做的与
c(1)[[2]]
@manotheshark没有什么不同,所以我想问的是,是否有一种方法可以让R立即计算
posterior
,而不是懒散地计算。我想有一个更简单的例子是可能的
f=function()字母[i]
。由于
[i]
未在函数中定义或作为参数传入,因此在调用
i
值时,函数将查看其父环境。无论函数之前是否定义了
i
,函数都是相同的。调用函数时,该函数将检查
i
的值。啊,好的。所以我只需要将
I
作为变量传递给函数。谢谢@Gregor。如果你能在调用时传递你想要的
i
的值,那就行了。否则,我会让你们阅读关于懒惰评估的内容,而不是关于懒惰评估的内容。我想这就是问题所在,但我该如何解决它呢?我可以“关闭”惰性评估吗?不幸的是,您不能简单地“关闭”惰性评估。根据你到底想做什么,可能会有或多或少的惯用方法来解决这个问题。