2015-04-24 3 views
1

Я не понимаю, почему во всем мире в области видимости список в R, не может быть изменен в пределах функции следующим образом:Глобальных переменного и область применения - R

global <<- list() 

f <- function(x) { 
    global[[x]] <- "blah" 
} 

f(1) 
f(2) 
print(global) 

Выход

list() 

Тем не менее, я ожидал выход:

[[1]] 
[1] "blah" 

[[2]] 
[1] "blah" 

Почему это? Должен ли я объявлять каждый элемент списка глобальным?

Кажется, что то же самое справедливо для переменных локальной области видимости, объявленных вне функционального блока.

Спасибо!

+6

'<< -' должно быть внутри вашей функции –

ответ

2

В принципе, поскольку вы используете назначение «< -», эта функция создает копию «глобальной» переменной для использования в рамках функции.

Это можно увидеть, добавив вторую функцию g(), которая изменяет значение «global» перед ее печатью в f(), но на этот раз с использованием «< < -». Первая строка в f() создает вашу локально скопированную копию «global» для f (x), а затем вы обновляете глобальную копию «global» с помощью g (x).

global <<- list() 

f <- function(x) { 
    global[[x]] <- "blah" 
    g(x) 
    global 
} 

g <- function(x){ 
    global[[x]] <<- "newblah" 
} 


f(1) #prints 'blah', despite the fact the g(x) has already updated the value 

global #prints 'newblah' 

Если F (х) по-прежнему ссылаясь на глобальную копии «глобальный» было бы напечатать «newblah», который был назначен в г (х). Вместо этого он печатает значение, которое было назначено в f (x), на локально скопированную копию «global».

Однако, печать 'global' вне любой функции показывает, что g (x) действительно обновила значение для глобальной копии 'global'.

Теперь, если вы переместите g (x) внутри f (x), то f (x) теперь является родительским элементом g (x).В этом случае «< < -» присваивает значение «global», которое входит в область f (x). Таким образом, глобальная копия «global» по-прежнему пуста, но если вы распечатаете «global» в области f(), вы получите обновленное значение.

global <<- list() 

f <- function(x) { 
    global[[x]] <- "blah" 

    g <- function(x){ 
    global[[x]] <<- "newblah" 
    } 

    g(x) 
    global 
} 



f(1) #prints 'newblah' 

global #empty 
3

Я считаю, что вы просто немного смущены тем, что на самом деле делает <<-. От help("<<-"):

Операторы < < - и - >>, как правило, используются только в функциях, и вызывают поиск к сделанному через материнские среды для существующего определения переменной быть назначены. Если такая переменная найдена (и ее привязка не заблокирована), то ее значение переопределяется, в противном случае назначение происходит в глобальной среде.

Таким образом, из этого следует, что <<- не создает «глобальную переменную» везде, где она выполняется. Действительно, на самом деле это не так, как работает R.

Скорее <<- выполняет своего рода «глобальное присвоение», позволяя изменять переменные за пределами текущей области.

Это своего рода грубая версия более точной версии assign(). Использование обоих этих инструментов обычно обескураживается, поскольку они имеют тенденцию нарушать парадигму функционального программирования, которую использует R (т. Е. Никаких побочных эффектов). Как и все остальное, они используют их, но обычно не для рутинной обработки переменных.

Смежные вопросы