Я пытаюсь написать R-скрипт, который использует вложенные функции для сохранения нескольких фреймов данных (параллельно) в глобальной среде. Приведенный ниже пример кода отлично работает в Windows. Но когда я переместил этот же код на сервер Linux, объекты, которые функция - prepare_output () сохраняет в глобальную среду, не были захвачены операцией save () в функции - get_output ().
Мне не хватает чего-то, что принципиально отличается от того, как mcmapply влияет на область действия в Linux против Windows?
library(data.table)
library(parallel)
#Function definitions
default_case <- function(flag){
if(flag == 1){
create_input()
get_output()
}else{
Print("select a proper flag!")
}
}
create_input <- function(){
dt_initial <<- data.table('col1' = c(1:20), 'col2' = c(21:40)) #Assignment to global envir
}
get_output<- function(){
list1 <- c(5,6,7,8)
dt1 <- data.table(dt_initial[1:15,])
prepare_output<- function(cnt){
dt_new <- data.table(dt1)
dt_new <- dt_new[col1 <= cnt, ]
assign(paste0('dt_final_',cnt), dt_new, envir = .GlobalEnv )
#eval(call("<<-",paste0('dt_final_',cnt), dt_new))
print('contents in global envir inside:')
print(ls(name = .GlobalEnv)) # This print all object names dt_final_5 through dt_final_8 correctly
}
mcmapply(FUN = prepare_output,list1,mc.cores = globalenv()$numCores)
print('contents in global envir outside:')
print(ls(name = .GlobalEnv)) #this does NOT print dataframes generated and assigned to global in function prepare_output
save( list = ls(name = .GlobalEnv)[ls(name = .GlobalEnv) %like% 'dt_final_' ], file = 'dt_final.Rdata')
}
if(Sys.info()['sysname'] == "Windows"){numCores <- 1}else{numCores <- parallel::detectCores()}
print('numCores:')
print(numCores)
#Function call
default_case(1)
Причина, по которой я использую вложенную структуру, заключается в том, что подготовка dt1 занимает много времени, и я не хочу увеличивать время выполнения путем его выполнения каждые l oop в Подать заявку.