Как я могу перечислить только функции и те, которые приходят из пакета

Я использую пакет foreach для распараллеливания некоторых вещей, и я устал указывать 5 функций в .export каждый раз, когда мне нужно его использовать.

Я знаю, что могу сделать foreach(...,.export=ls(.GlobalEnv)), но это передает много данных рабочим процессам и замедляет меня (могут быть определены большие таблицы).

Итак, вопрос в том, как я могу перечислить только функции в .GlobalEnv

Я это сделал:

getAllFunctions <- function(envir=.GlobalEnv){
        allClasses <- sapply(grep(x=ls(envir), pattern='^%', value=TRUE, invert=TRUE), FUN=function(x){class(eval(parse(text=x)))})
        fnNames <- names(allClasses)[allClasses == 'function']
        return(fnNames)
}

Но это некрасиво (и дает все), и я уверен, что есть идиоматический способ


person statquant    schedule 09.08.2016    source источник
comment
Вы могли бы начать с ls.str(mode = "function", envir = .GlobalEnv), я думаю   -  person David Arenburg    schedule 09.08.2016
comment
или фактически вернуть свои функции с помощью as.list(.GlobalEnv)[sapply(.GlobalEnv, is.function)]   -  person user20650    schedule 09.08.2016
comment
@ user20650: да, так лучше, я приму это как ответ   -  person statquant    schedule 09.08.2016
comment
или вы можете обернуть ответ Дэвида в mget, что, я думаю, немного лучше/понятнее   -  person user20650    schedule 09.08.2016
comment
или, возможно, Filter(is.function, as.list(.GlobalEnv))   -  person talat    schedule 09.08.2016
comment
Предположим, вы хотите включить или удалить эти функции из определенных пакетов, вы можете сделать это, отфильтровав search(), например, sapply(search()[1:3], ls.str) даст вам первые два прикрепленных пакета, а также файл .GlobalEnv.   -  person shayaa    schedule 09.08.2016
comment
добавление к комментарию Shayaa. вы можете явно указать пакеты mget(ls.str(paste0("package:", c("base", "stats")), mode="function"))   -  person user20650    schedule 09.08.2016
comment
В пакете foreach версии 1.4.3 в справке по функции foreach поясняется, что .export требуется только для объектов, не входящих в текущую среду. Это также объясняется в документе на странице пакета 9. Итак, в вашем случае, я думаю, вам не нужно экспортировать функцию в воркер, если они уже находятся в .Globalenv. %dopar% оператор автоматически сделает это за вас. Оставьте аргумент равным NULL.   -  person cderv    schedule 09.08.2016
comment
@Titolondon: я использую эту версию и определяю. приходится экспортировать.   -  person statquant    schedule 09.08.2016
comment
Странный. Однажды я заметил это автоматическое поведение, и с тех пор мне больше не нужно было экспортировать объекты для моей текущей среды. Мне просто нужно экспортировать пакет, который я использую для своего кода.   -  person cderv    schedule 09.08.2016
comment
Если это не работает для вас, можно сделать вывод, что это работает для переменной в .Globalenv, но не для функций... Я постараюсь в следующий раз проверить это. одна из возможностей также состоит в том, чтобы создать небольшой пакет с функцией, которую вы используете для своего проекта, и передать пакет с помощью .packages.   -  person cderv    schedule 09.08.2016
comment
@Titolondon Я согласен сделать пакет из своих вещей, хотя это делает разработчика запутанным.   -  person statquant    schedule 09.08.2016


Ответы (1)


Из комментариев:

as.list(.GlobalEnv)[sapply(.GlobalEnv, is.function)]
person statquant    schedule 20.08.2016