【发布时间】:2014-06-29 07:26:45
【问题描述】:
背景
我正在开发一个函数,它接收一个介于 1 和 3 之间的 w 值,并从 3 个分布之一返回 n 值。
我遇到的问题是n 或w 的长度不是1。所以我添加了2 个参数nIsList 和wIsList 来创建我想要的功能。我希望它的工作方式如下:
(按需工作)
If nIsList ex( c(1,2,3) )返回一个相当于运行consume(w,1),consumer(w,2),consumer(w,3)的列表
(按需工作)
If wIsList ex( c(1,2,3) )返回一个相当于运行consume(1,n)、consume(2,n)、consumer(3,n)的列表
(不能按需要工作)
If nIsList ex(1,2,3) and wIsList ex(1,2,3)
返回一个等效于运行消耗(1,1),消耗(2,2),消耗(3,3)的列表。相反,我得到一个相当于运行 [consume(1,1), consume(1,2), consume(1,3)], [consume(2,1), consume(2,2), consume(2) 的列表,3)], [消费(3,1),消费(3,2), 消费(3,3)]
我明白为什么我会得到我得到的结果。我似乎无法弄清楚如何获得我想要的结果。 (如上所述)
问题
当 wIsList 和 nIsList 为 True 时,我希望该函数为 w 和 n 中的每个元素提供一个消耗 (w[i], n[i]) 的列表。有没有办法使用 lapply 做到这一点?
代码:
library("triangle")
consume <- function(w, n=1, nIsList=F, wIsList=F){
if(!nIsList & !wIsList){
if(w==1){
return(rtriangle(n,0.3,0.8))
}else if(w==2){
return(rtriangle(n,0.7,1))
}else if(w==3){
return(rtriangle(n,0.9,2,1.3))
}
}
else if(nIsList & !wIsList){
return(sapply(n, consume, w=w))
}
else if(nIsList & wIsList){
return(lapply(n, consume, w=w, wIsList=T))
}
else if(!nIsList & wIsList){
return(lapply(w, consume, n))
}
}
注意:我无法总结这个问题。如果您对重命名有任何建议,请告诉我,我会这样做的。
【问题讨论】:
-
你看过
mapply吗?好像这样就可以了 -
非常感谢!!解决了!
-
酷没问题,抱歉无法在我的手机上输入答案:p