В идеальном мире данные входят в функцию как аргумент и оставляют ее как возвращаемое значение. Это хороший принцип. Кроме того, это предпочтительно для повторного использования кода. Прямо сейчас вы можете быть уверены, что вы будете вызывать этот код только на df
(кстати, плохая репутация, поскольку в R уже есть функция, вызывающая df
, и это может привести к ужасным сообщениям об ошибках).
Единственным исключением из этого правила и причиной, по которой существует <<-
(*), редко может быть производительность.
Однако в случае только для чтения существует не дает прироста производительности, так как R ведет себя умно.
Для запуска следующего кода потребуется установить пакет microbenchmark
:
expl <- data.frame(a = rep("Hello world.", 1e8),
b = rep(1, 1e8))
fun1 <- function(dataframe) return(sum(dataframe$b))
fun2 <- function() return(sum(expl$b))
microbenchmark::microbenchmark(fun1(expl), fun2())
Попробуйте, и вы увидите, что нет увеличения производительности в fun2
по fun1
, даже если фрейм данных имеет значительный размер.
Изменить :
(*), как я узнал из комментария Конрада Рудольфа ниже, <<-
может быть полезно при передаче данных родителю, не обязательно глобальному пространству имен. Очень интересно читать даже если не строго на топи c здесь: http://adv-r.had.co.nz/Functional-programming.html#mutable -состояние