如何为特定值 ex.w[i] == n[i] 设置递归 lapply?
Posted
技术标签:
【中文标题】如何为特定值 ex.w[i] == n[i] 设置递归 lapply?【英文标题】:How to setup a recursive lapply for specific values ex.w[i] == n[i]? 【发布时间】: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
【参考方案1】:
感谢 JPC 的评论,使用 mapply
可以解决问题。新代码如下:
consume <- function(w, n=1)
nIsList <- length(n) > 1 # Change based on JPC's second comment
wIsList <- length(w) > 1 # Change based on JPC's second comment
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(mapply(consume,w,n)) ## Updated portion
else if(!nIsList & wIsList)
return(lapply(w, consume, n))
【讨论】:
顺便说一句,您还可以计算n
或w
的长度以确定它们是否是一个列表(即lenght(w)>1
,这样您就可以避免必须传递isList
参数。
我正在辩论这样做。有时我希望函数使用所用向量的长度而不是实际属性,但我想我应该将其作为参数输入,而不是让函数以这种方式工作。会更新它。谢谢!以上是关于如何为特定值 ex.w[i] == n[i] 设置递归 lapply?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 CoreData 中的特定索引设置值。 iOS 斯威夫特
如何为使用 python 保存的 tiff 图像设置像素大小,以便将像素高度和宽度设置为 ImageJ 中的特定值?