【问题标题】:Usage of local variables局部变量的使用
【发布时间】: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”

标签: r scope


【解决方案1】:

使用local。使用您的示例:

local({ 
     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!

【讨论】:

    【解决方案2】:

    您可以创建一个新的environment 来定义您的变量;这就是函数内局部作用域的定义方式。

    你可以阅读更多关于这个here

    同时查看environment 的帮助,即在您的R 控制台中输入?environment

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多