Области без глобальных переменных в R - PullRequest
0 голосов
/ 05 ноября 2018

Я, кажется, глубоко смущен тем, что составляет хорошую практику в 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 голосов
/ 05 ноября 2018

В 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
> 
...