如何为特定值 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 值。 我遇到的问题是nw 的长度不是1。所以我添加了2 个参数nIsListwIsList 来创建我想要的功能。我希望它的工作方式如下:

按需工作

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)) 
  

【讨论】:

顺便说一句,您还可以计算nw 的长度以确定它们是否是一个列表(即lenght(w)&gt;1,这样您就可以避免必须传递isList参数。 我正在辩论这样做。有时我希望函数使用所用向量的长度而不是实际属性,但我想我应该将其作为参数输入,而不是让函数以这种方式工作。会更新它。谢谢!

以上是关于如何为特定值 ex.w[i] == n[i] 设置递归 lapply?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 CoreData 中的特定索引设置值。 iOS 斯威夫特

如何为使用 python 保存的 tiff 图像设置像素大小,以便将像素高度和宽度设置为 ImageJ 中的特定值?

如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画

如何为锚标签添加某个值?

如何为特定图片分配评级?

在FastReport中如何为特定的数据行设置显示格式?