2013-02-23 2 views
1

Есть ли что-нибудь вроде sapply в библиотеке multicore? Или мне нужно unlist(mclapply(..)) для этого?multicore :: sapply?

Если этого не существует: какими были бы рассуждения?

Спасибо заранее и извините, если это глупый вопрос!

ответ

2

Если вы посмотрите на код sapply (и его вспомогательной функции simplify2array) вы увидите, что unlist(obj) именно то, что будет сделано в том случае, когда OBJ представляет собой список элементов все length==1. Однако sapply намного сложнее, чем просто список списков. Что еще очень неясно, какая проблема вы пытаетесь решить.

3

В библиотеке parallel, у вас есть mcmapply, которые, как mapply в base, принимает SIMPLIFY аргумент. По умолчанию это TRUE. Вот пример использования:

library(parallel) 
mcmapply(sqrt,split(1:8,1:8)) 
#  1  2  3  4  5  6  7  8 
# 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 

Сравните это с использованием mclapply.

mclapply(split(1:8,1:8),sqrt) 
# $`1` 
# [1] 1 
# 
# $`2` 
# [1] 1.414214 
# ... 
+0

В некоторых отношениях, однако, я согласен с тем, что странно, что нет 'mcsapply'. Я всегда думал, что странно, что вы не можете передать аргумент 'SIMPLIFY' для' lapply', но я подозреваю, что это причина, по которой вы не можете передать аргумент 'SIMPLIFY' для' mclapply'. – nograpes

+0

Разве это не тот случай, когда mclapply действует в списках и поэтому возвращает списки по умолчанию так же, как sapply действует на векторы, а упрощение - по умолчанию? – russellpierce

+0

@rpierce Фактически 'sapply' также действует и в списках (и' lapply' также работает и с векторами). Единственная разница между 'sapply' и' lapply' - это структура возвращаемого значения. 'lapply' всегда будет * возвращать список, а' sapply' может возвращать вектор или список. Имена возвращаемого значения также различаются. Я считаю, что было бы разумно создать «mcsapply», который имел бы такое же поведение, как «sapply». – nograpes