【发布时间】:2013-01-25 10:21:24
【问题描述】:
问题:
如何在 r 代码的范围内定义局部变量。
示例:
在 C++ 中,以下示例定义了一个范围,在该范围内声明的变量在外部代码中未定义。
{
vector V1 = getVector(1);
vector V1(= getVector(2);
double P = inner_product(V1, V2);
print(P);
}
// the variable V1, V2, P are undefined here!
注意:这段代码只是为了说明这个想法。
这种做法有以下优点:
- 保持全局命名空间干净;
- 简化代码;
- 消除歧义,特别是在未初始化的情况下重新使用变量时。
在 R 中,在我看来,这个概念只存在于函数定义中。因此,为了重现前面的示例代码,我需要执行以下操作:
dummy <- function( ) {
V1 = c(1,2,3);
V2 = c(1,2,3);
P = inner_product(V1, V2);
print(P);
}
dummy( );
# the variable V1, V2, P are undefined here!
或者,以一种更隐晦的方式,声明一个匿名函数来阻止函数调用:
(function() {
V1 = c(1,2,3);
V2 = c(1,2,3);
P = inner_product(V1, V2);
print(P);
})()
# the variable V1, V2, P are undefined here!
问题
有没有更优雅的方法来创建局部变量?
【问题讨论】:
-
默认包中没有名为 inner_product 的函数,但使用普通向量“*”应该会给你。这:
(function() { V1 = c(1,2,3); V2 = c(1,2,3); P = V1*V2; print(P); })()给出#[1] 1 4 9。我不明白为什么它没有 C++ 版本那么清晰或简单。如果您的代码抛出错误,这不是因为范围问题,而是因为您忽略了错误消息。如果这不是您在感叹性评论中所说的,那么您需要进一步解释。 -
提到代码只是为了说明问题,而不是处理内积。第二条评论给出了更好的答案,其中包括“本地”构造的使用,例如 local({ c=c(1,2,3); d=c(2,3,4);e = c* d; 打印(e)})
-
我恐怕还是不明白“变量V1、V2、P在这里未定义!”是什么意思。
-
表示该变量未在该范围内定义。例如,代码:
local({ v=c(1,2,3); })将产生错误Error in print(v) : object 'v' not found,如果尝试在本地块之外使用 v。 > print(v) print(v) 中的错误:找不到对象“v”