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