在函数内使用mapply(...)

时间:2015-08-05 19:57:02

标签: r mapply

我正在尝试生成几个随机数系列,每个系列都有一组不同的参数。然后我想复制所有这些。我希望有一个函数来执行此操作,看起来它应该是一个类似于rnorm()的单行代码来生成数字,mapply()来为多个参数集生成这些数字,以及{ {1}}重复整个过程。

为了达到这个目的,我编写了一个函数,其replicate()参数我希望与...中的...对应,但mapply似乎被忽略... {1}}。我有一些例子可以澄清我想要的输出,以及问题:

mapply

我猜我需要把 # Some values to be passed to the ... of mapply mus <- c(-30, 0, 30) sds <- c(0.1, 1, 10) # ================================= # = What I want, if it would work = # ================================= f <- function(n=3, ...){ replicate(2, mapply(rnorm, MoreArgs=list(n=n), ...)) } f(mean=mus, sd=sds) # Doesn't work :( >, , 1 > > [,1] >[1,] -0.4901243 >[2,] 0.8268027 >[3,] -0.4829781 > >, , 2 > > [,1] >[1,] -0.02025903 >[2,] -1.57011537 >[3,] 0.49234503 # ========================================================== # = What I can currently get to work, but not style I want = # ========================================================== # I can't understand why f.inside is needed! f2 <- function(n=3, ...){ f.inside <- function() mapply(rand.gen, MoreArgs=list(n=n), ...) replicate(2, f.inside()) } f2(mean=mus, sd=sds) # Desired output >, , 1 > > [,1] [,2] [,3] >[1,] -29.83762 -0.06138165 9.956601 >[2,] -30.04880 1.39123405 33.036675 >[3,] -29.94070 -1.15741513 19.337497 >[4,] -29.92360 0.74300731 38.741367 >[5,] -29.81723 0.84565813 22.261605 > >, , 2 > > [,1] [,2] [,3] >[1,] -30.01407 -0.5198845 20.85942 >[2,] -29.77586 -0.1705062 22.06274 >[3,] -29.96901 -0.4412471 21.42849 >[4,] -30.04079 0.4230790 28.35480 >[5,] -30.04794 0.3000821 50.09012 包裹起来;我偶然尝试了...alist()list()bquote()expression()以及其他几种失败方法。

1)为什么as.call()中的mapply似乎完全忽略了f() 编辑:这是一个辅助问题,答案是“点不能与复制一起使用”。好的,关于核心问题......

...

2)如何将对象的元素拆分为长度(对象)元素,并将它们作为单独的项目传递给# ===================================== # = OK, Function for Refined Question = # ===================================== f.edit <- function(n=3, ...){ l <- list(...) replicate(2,mapply(rnorm, MoreArgs=list(n=n), l)) } f.edit(mean=mus, sd=sds) # Doesn't work :( 的{​​{1}}?

我需要在省略号上做得更好。我真的很难过这个。

2 个答案:

答案 0 :(得分:1)

f.edit ...

的方式尝试
  • 您可以构建参数列表并使用do.call执行mapply

    function(n=3, ...){
      dots<-list(...);
      replicate(2,do.call(mapply,c(list(FUN=rnorm),dots,list(MoreArgs=list(n=n)))))
    }
    
  • 或者,提取参数并直接调用

    function(n=3, ...){
      dots<-list(...);
      replicate(2,mapply(rnorm,dots$mean,dots$sd,MoreArgs=list(n=n)))
    }
    

在任何一种情况下,您都会在正确的环境中强制评估...,就像您在f2MrFlick's alternative中所做的那样。

f.edit所写的问题是rnorm被称为rnorm(n,list(means=mus,sd=sds))而不是rnorm(n,means=mu,sd=sds)

但是,在这种情况下,您可以考虑使用rnorm已经对其均值和sd参数进行矢量化的事实

function(n,reps,mean,sd) {
  m<-length(mean);
  aperm(array(rnorm(n*m*reps,mean,sd),c(m,n,reps)),c(2,1,3))
}

答案 1 :(得分:1)

问题在于,您不允许library(parallel) process <- function(){ from <- seq(as.Date("1950-01-01"), by = "day", length = 100000) to <- seq(as.Date("1950-01-04"), by = "day", length = 100000) DT <- data.frame(from,to) Ncores <- detectCores() flagList <- mclapply(1:nrow(DT),function(id){ 4 %in% strftime(seq(as.Date(DT[id,1]), as.Date(DT[id,2]), by="day"), format="%w") },mc.cores=Ncores) flag <- unlist(flagList) return(cbind(DT,flag)) } 使用...,因为已经讨论过{{3}}。

我已经认为您找到了帮助函数replicate中最具可读性的替代方案来获取f.inside()条款。

另一个选择是避免...并使用replicate(使用您最终忽略的索引值)

lapply