R中没有全局变量的作用域

时间:2018-11-04 23:25:08

标签: r scope

对于R中的优良作法,我似乎深感困惑。假设我有以下R代码:

f<-function()  
{  
    g<-function(s)
    {
      b<-b+1
      s<-s+5
    }
b<-10
g(2)
return(b)
}

在任何一种典型的语言中,这将始终返回b = 10,据我所知,使f识别g正在修改b的典型方法是使用全局变量。但是,据我所知,R尽可能避免使用全局变量似乎是一种惯例。这使我问,我应该如何修改f以便在不使用全局变量的情况下输出b = 11?我似乎有一个非常深刻的误解,或者是对一个非常重要的想法一无所知。

1 个答案:

答案 0 :(得分:0)

R中的赋值运算符有三种形式:<-=<<-。第三种格式<<-将值分配给当前环境的父级中的对象。

如果您在g()函数中使用此表单,它将使b函数中f()的值增加1。

f<-function()  
{  
     g<-function(s)
     {
          # use <<- form instead of <- 
          b<<-b+1
          s<-s+5
     }
     b<-10
     g(2)
     return(b)
}

...以及输出:

> f<-function()  
+ {  
+      g<-function(s)
+      {
+           b<<-b+1
+           s<-s+5
+      }
+      b<-10
+      g(2)
+      return(b)
+ }
> f()
[1] 11
>