Глобальные переменные как параметры функции - PullRequest
0 голосов
/ 16 июня 2020

В проекте R у нас есть глобальный фрейм данных df, который должен использоваться внутри функции my_func(). Фрейм данных не будет изменен, но он будет использоваться как таблица «только для чтения».

Не могли бы вы помочь мне, как лучше всего:

  1. Включите фрейм данных в параметры функции, как в

    my_func(df)
    {
    a <- df[1,2]
    }
    

    OR

  2. Не включать его в параметры, просто используйте его (прочтите ) в теле функции, как в

    my_func()
    {
    a <- df[1,2]
    }
    

1 Ответ

0 голосов
/ 16 июня 2020

В идеальном мире данные входят в функцию как аргумент и оставляют ее как возвращаемое значение. Это хороший принцип. Кроме того, это предпочтительно для повторного использования кода. Прямо сейчас вы можете быть уверены, что вы будете вызывать этот код только на 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 -состояние

...