2015-01-30 4 views
5

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

Должно быть ясно, с кодом:

a<-c(1,2) 
b<-length(a) 
a<-c(1,2,3) 
b 
[1] 2 

Я хочу б вернуться 3.

Что я изменить во второй строке? Можно ли это сделать без определения новых пользовательских функций и использования внешних пакетов?

Ошибка при попытке Eval, переуступать, < < - до сих пор

ответ

6

Я не рекомендую, что вы должны реально использовать его, но makeActiveBinding() будет делать то, что вы просите:

makeActiveBinding("b", function() length(a), .GlobalEnv) 
a <- c(1,2) 
b 
# [1] 2 
a <- c(1,2,4) 
b 
# [1] 3 
+0

Удивительно. Какой лучший источник информации (например, книга), где я могу больше узнать об этом (за исключением, очевидно, просто привязки к поиску в Google). Существуют ли какие-либо «синонимы» этой привязки на других языках программирования или связанных с ними темах? Я также хотел бы использовать что-то подобное в сценариях оболочки - это также называется привязкой в ​​bash ?. – stuckNlazy

+0

Хм. Не уверен. Основная идея, однако, заключается в том, что за кулисами, набирая 'b', запускается функция' length (a) 'каждый раз, когда она оценивается. Лично мне было бы гораздо удобнее просто определить простую функцию 'b <- function() length (a)', а затем выполнить 'b()' (а не 'b'), чтобы получить длину' a'. Таким образом, вы уклоняетесь от какой-либо мутной магии, которая действительно происходит за кулисами, с тем, что даже «? MakeActiveBinding» описывает как «экспериментальный интерфейс». Просто набрав дополнительный '()', вы можете оставаться в более распространенном мире простых определений функций и вызовов функций. –

+0

@ JoshO'Brien - я бы добавил это к ответу, а не оставлял его здесь в комментариях. Все, что вы сказали, кажется мне очень мудрым. – thelatemail

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