Не удается преобразовать окружение в ошибку функции при использовании multidplyr
Это пример использования multidplyr
позвоните в мой код, который я запускаю на кластере моего института:
#create data
set.seed(1)
library(dplyr)
df <- do.call(rbind,lapply(1:100,function(i){
id.df <- data.frame(id=paste0("ID",i),value=runif(1000,0,5),group=c(rep("group1",500),rep("group2",500)))
id.df$value[sample(1000,250,replace=F)] <- 0
return(id.df)
})) %>% dplyr::group_by(id)
#simple function
tTest <- function(df)
{
df$p.value <- t.test(dplyr::filter(df,group == "group1")$value,dplyr::filter(df,group == "group2")$value)$p.value
return(df)
}
#call to multidplyr
df %>% multidplyr::partition(id) %>% multidplyr::cluster_library("tidyverse") %>% multidplyr::cluster_library("MASS") %>%
multidplyr::cluster_assign_value("tTest", tTest) %>%
do(results = tTest(.)) %>% dplyr::collect() %>% .$results %>% dplyr::bind_rows()
Я получаю это сообщение об ошибке:
Initialising 15 core cluster.
── Attaching packages ─────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.0.0.9000 ✔ readr 1.1.1
✔ tibble 1.4.2 ✔ purrr 0.2.5
✔ tidyr 0.8.1 ✔ stringr 1.3.1
✔ ggplot2 3.0.0.9000 ✔ forcats 0.3.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
Attaching package: ‘MASS’
The following object is masked from ‘package:dplyr’:
select
Error in checkForRemoteErrors(lapply(cl, recvResult)) :
15 nodes produced errors; first error: Can't convert an environment to function
Call `rlang::last_error()` to see a backtrace
In addition: Warning message:
group_indices_.grouped_df ignores extra arguments
А также:
> rlang::last_error()
NULL
Так что я не знаю, с чего начать отлаживать эту проблему.
У кого-нибудь есть идея?
Вот sessionInfo
если это полезно:
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /sw/R/R-3.4.3-install/lib64/R/lib/libRblas.so
LAPACK: /sw/R/R-3.4.3-install/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] MASS_7.3-51 forcats_0.3.0 stringr_1.3.1 purrr_0.2.5
[5] readr_1.1.1 tidyr_0.8.1 tibble_1.4.2 ggplot2_3.0.0.9000
[9] tidyverse_1.2.1 dplyr_0.7.7
loaded via a namespace (and not attached):
[1] Rcpp_0.12.19 cellranger_1.1.0 pillar_1.1.0
[4] compiler_3.4.3 plyr_1.8.4 bindr_0.1.1
[7] tools_3.4.3 jsonlite_1.5 lubridate_1.7.4
[10] gtable_0.2.0 nlme_3.1-137 lattice_0.20-34
[13] pkgconfig_2.0.2 rlang_0.2.2.9001 cli_1.0.1
[16] rstudioapi_0.7 parallel_3.4.3 haven_1.1.2
[19] bindrcpp_0.2.2 withr_2.1.2 xml2_1.2.0
[22] httr_1.3.1 hms_0.4.2 grid_3.4.3
[25] tidyselect_0.2.5 glue_1.3.0 R6_2.3.0
[28] readxl_1.1.0 multidplyr_0.0.0.9000 modelr_0.1.2
[31] magrittr_1.5 backports_1.1.2 scales_1.0.0.9000
[34] rvest_0.3.2 assertthat_0.2.0 colorspace_1.3-2
[37] stringi_1.2.4 lazyeval_0.2.1 munsell_0.5.0
[40] broom_0.5.0 crayon_1.3.4
Пробуя то же самое на моем настольном Mac, он работает нормально. Я оценил это multidplyr
позвоните с помощью простого вызова на моем столе и получите:
Unit: milliseconds
expr
df %>% multidplyr::partition(id) %>% multidplyr::cluster_library("tidyverse") %>% multidplyr::cluster_library("MASS") %>% multidplyr::cluster_assign_value("tTest", tTest) %>% do(results = tTest(.)) %>% dplyr::collect() %>% .$results %>% dplyr::bind_rows()
min lq mean median uq max neval
190.7746 195.7953 206.1758 203.7096 213.0648 296.4428 100
Unit: milliseconds
expr min lq mean median uq max neval
df %>% dplyr::group_by(id) %>% tTest() 16.28017 18.2625 19.45435 18.6393 19.06788 30.07284 100
Есть ли постоянные накладные расходы, которые multidplyr
добавляет, чтобы настроить ядра, который измеряется в microbenchmark
что делает его гораздо менее благоприятным в этом игрушечном примере, но определенно стоит ли это в гораздо больших наборах данных?
В противном случае я упускаю смысл в использовании multidplyr
?
большое спасибо