которая его мутирует? У меня в этом примере не получается:
lst <- list()
f <- function () {
lst[[length(lst) + 1]] = "new"
}
f() ; f() ; f();
lst # пустой :(
Но если заинлайнить функцию f то всё хорошо.
f <- function () { lst[[length(lst) + 1]] = "new" assign(x = 'lst', value = lst, envir = rlang::caller_env()) }
О, спасибо большое:) Интересные вещи.. какой то caller_env 🧐 Буду разбираться
caller_env можно не указывать, у меня просто привычка после редактирования собственного пакета (подгружается через library). У R есть дурное свойство работать по умолчанию с глобальным окружением, а по логике всегда нужна работа с окружением, которое вызвало функцию.
насколько я помню, R работает с тем окружением, где функция была объявлена
Как вариант, бывает и так. Но возникают проблемы, когда функция объявлена в отдельном проекте пакете, когда подгружается через library (у нее и по умолчанию окружение другое), и ещё проблемы при ее использовании в распараллеленом задании. В обоих случаях она обращается к переменным в глобальном окружении, если жёстко не сажать внутри функции на called_env.
это вы про namespace::base, видимо, там вообще наркомания %)
Просто вместо = напишите такую стрелку: «-
Богдан ответ дал хороший, но сам вопрос с подвохом. Зачем такая функциональность? Это требуется в редких случаях, но лучше обходиться без подобного стиля. Почему просто не вернуть значение?
Обсуждают сегодня