我正在尝试生成几个随机数系列,每个系列都有一组不同的参数。然后我想复制所有这些。我希望有一个函数来执行此操作,看起来它应该是一个类似于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}}?
我需要在省略号上做得更好。我真的很难过这个。
答案 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)))
}
在任何一种情况下,您都会在正确的环境中强制评估...
,就像您在f2
和MrFlick'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