Недавно я работал с набором R-скриптов, доставшихся мне от коллеги. Для меня это надежный источник, но я не раз встречал в его коде автоматические назначения вроде

x <<- x

Есть ли какая-то область, в которой такая операция могла бы иметь смысл?

2
Manfredo 6 Сен 2016 в 17:44

4 ответа

Лучший ответ

Это механизм для копирования значения, определенного внутри функции, в глобальную среду (или, по крайней мере, где-нибудь в стеке родительской среды): from ?"<<-"

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

Я не думаю, что это особенно хорошая практика (R - это в основном функциональный язык, и, как правило, лучше избегать побочных эффектов функций), но он что-то делает. ( @Roland указывает в комментариях, а @ BrianO'Donnell в своем ответе [цитирует Томаса Ламли], что использование <<- является хорошей практикой, если вы используете его для изменения функции закрытие, как в demo(scoping). По моему опыту, его чаще неправильно используют для создания глобальных переменных, чем для чистой работы с закрытием функций. )

Рассмотрим этот пример, начиная с пустой / чистой среды:

f <- function() {
     x <- 1     ## assignment
     x <<- x    ## global assignment
}

Прежде чем мы позвоним f():

x
## Error: object 'x' not found

Теперь позвоните f() и попробуйте еще раз:

f()
x
## [1] 1
4
Ben Bolker 6 Сен 2016 в 16:00
<<- 

- это глобальный оператор присваивания, и я думаю, вряд ли когда-либо будет причина его использовать, потому что он вызывает побочные эффекты.
Область его использования будет в любом случае, когда нужно определить глобальную переменную или переменную на один уровень выше текущей среды.

1
USER_1 6 Сен 2016 в 14:59

Алан дает хороший ответ: Используйте оператор сверхназначения << - чтобы писать наверху .

Хэдли также дает хороший ответ: Как вы используете "<< -" (определение области действия) в R?.

Подробные сведения об операторе 'superassignment' см. В Scope. .

Вот важная информация об операторе из раздела Операторы присваивания в руководстве R:

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

Томас Ламли хорошо резюмирует: "Хорошее использование суперприсваивания связано с лексической областью видимости, когда среда хранит состояние для функции или набора функций, которые изменяют состояние с помощью суперприсваивания "

1
Community 23 Май 2017 в 12:08

Например:

x <- NA

test <- function(x) {
 x <<- x
}

> test(5)
> x
#[1] 5

Это простое использование: <<- будет выполнять поиск в родительской среде (в случае объявлений вложенных функций) и, если не найден, назначить в глобальной среде.

TM

1
Tensibai 6 Сен 2016 в 15:55