sapply
упрощается до матрицы, в то время как при выводе списка ваших столбцов возвращается вектор каждого столбца, один за другим. Рассмотрите возможность использования функции cumsum
в качестве иллюстрации:
df <-
structure(
list(
ch1 = c(5L, 1L, 16L, 7L, 7L, 4L, 12L, 4L, 1L),
ch2 = c(2L, 4L, 14L, 5L, 2L, 7L, 8L, 2L, 2L),
ch3 = c(7L, 5L, 7L, 5L, 1L, 11L, 6L, 3L, 1L),
ch4 = c(10L, 4L, 4L, 3L, 3L, 4L, 7L, 2L, 1L),
ch5 = c(7L, 1L, 2L, 2L, 7L, 9L, 5L, 2L, 2L),
ch6 = c(10L, 2L, 2L, 5L, 2L, 3L, 9L, 4L, 1L),
ch7 = c(10L, 5L, 8L, 1L, 4L, 9L, 7L, 1L, 2L),
ch8 = c(6L, 4L, 7L, 6L, 1L, 14L, 4L, 1L, 1L)
),
class = "data.frame",
row.names = c("g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9")
)
sapply(as.list(df), cumsum)
#> ch1 ch2 ch3 ch4 ch5 ch6 ch7 ch8
#> [1,] 5 2 7 10 7 10 10 6
#> [2,] 6 6 12 14 8 12 15 10
#> [3,] 22 20 19 18 10 14 23 17
#> [4,] 29 25 24 21 12 19 24 23
#> [5,] 36 27 25 24 19 21 28 24
#> [6,] 40 34 36 28 28 24 37 38
#> [7,] 52 42 42 35 33 33 44 42
#> [8,] 56 44 45 37 35 37 45 43
#> [9,] 57 46 46 38 37 38 47 44
unlist(parallel::mclapply(1:8, function(x) {
return(cumsum(df[,x]))}, mc.preschedule = TRUE, mc.cores = 4L))
#> [1] 5 6 22 29 36 40 52 56 57 2 6 20 25 27 34 42 44 46 7 12 19 24 25 36 42
#> [26] 45 46 10 14 18 21 24 28 35 37 38 7 8 10 12 19 28 33 35 37 10 12 14 19 21
#> [51] 24 33 37 38 10 15 23 24 28 37 44 45 47 6 10 17 23 24 38 42 43 44
do.call(cbind, parallel::mclapply(1:8, function(x) {
return(cumsum(df[,x]))}, mc.preschedule = TRUE, mc.cores = 4L))
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#> [1,] 5 2 7 10 7 10 10 6
#> [2,] 6 6 12 14 8 12 15 10
#> [3,] 22 20 19 18 10 14 23 17
#> [4,] 29 25 24 21 12 19 24 23
#> [5,] 36 27 25 24 19 21 28 24
#> [6,] 40 34 36 28 28 24 37 38
#> [7,] 52 42 42 35 33 33 44 42
#> [8,] 56 44 45 37 35 37 45 43
#> [9,] 57 4618 46 38 37 38 47 44
Создано в 2020-03-25 с помощью пакета prex (v0.3.0)
Редактировать: После просмотра вашей функции вы добавляете сгенерированные в ней данные в один файл. Это может работать нормально, если выполняется последовательно, но когда вы делаете это в параллельных процессах, вы неизбежно столкнетесь с проблемами. Одновременное создание нескольких винных процессов само по себе также может быть не самой эффективной процедурой, с которой можно начать, даже если она дала правильные результаты (профилирование вашего (линейного) кода с пакетом profvis
показало бы вам узкое место). Есть ли альтернатива 2017File.exe
для вычисления fitness.val
?
Если ваш план действительно заключался в последовательном добавлении результатов из столбцов, то для правильного инициирования параллельного генерирования результатов с вашим exe-файлом, вы можете необходимо сохранить уникальные экземпляры последовательно растущего файла (ваша команда write.fwf), а затем передать их параллельно команде exe, создавая уникальные файлы output.txt для каждого последовательного шага, а затем загрузить полученные результаты в правильном порядке .