【问题标题】:How to setup a recursive lapply for specific values ex.w[i] == n[i]?如何为特定值 ex.w[i] == n[i] 设置递归 lapply?
【发布时间】: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

标签: r recursion lapply


【解决方案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参数。
  • 我正在辩论这样做。有时我希望函数使用所用向量的长度而不是实际属性,但我想我应该将其作为参数输入,而不是让函数以这种方式工作。会更新它。谢谢!
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2022-06-24
  • 2019-03-15
相关资源
最近更新 更多