【问题标题】:Scala equivalent of R's Mapply? [closed]Scala相当于R的Mapply? [关闭]
【发布时间】:2016-07-02 01:49:49
【问题描述】:

我来自 R 背景,所以我习惯使用 R 的 *apply 系列函数。

Scala 的 list.foreach(_.fun)list.map(_.fun) 函数与 R 的 lapply(list, fun) 函数非常相似,因为它们都在列表的每个元素上迭代地执行一个函数。

但是,R 也有一个函数mapply(fun, list1, list2, ...),当一个有多个列表并且想要对每个列表的第一个元素、每个列表的第二个元素等应用一个函数时,它很有用。例如,如果我有一个函数add(x, y, z),以及两个列表x=(1, 2, 3)y=(2, 3, 4)z=(3, 4, 5)mapply(add, x, y, z) 将返回(6, 9, 12)

Scala 是否有任何等效于 R 的 mapply,但不使用 for 循环?

【问题讨论】:

  • 有人能解释为什么这个问题被否决了吗?我在问一个编程问题,这个问题在 Google 上并不容易,而且似乎在 Stack Overflow 上也没有重复。不发表评论就投反对票不会对社区做出贡献。
  • 我没有对你投反对票,但是因为我也不喜欢没有 cmets 的投反对票,而且我有足够的代表知道为什么人们投票关闭你的帖子,我可以告诉你。他们指出的规则是“要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,描述问题以及迄今为止为解决该问题所做的工作”
  • 这个怎么样:dahl.byu.edu/software/rscala/rscala-jss.pdf。你可以在 Scala 中使用mapply
  • 我不懂 Scala,但this 似乎是同一个一般问题。
  • @Hack-R:这是一个非常有趣的包!我认为对于这样的问题实际上切换到 R 编程有点过头了,但存在这个选项很酷。

标签: r scala foreach mapply


【解决方案1】:

标准库中没有类似的例程,但你可以接近:

scala> List(List(1,2,3),List(5,6,7),List(14,13,12)).transpose
res3: List[List[Int]] = List(List(1, 5, 14), List(2, 6, 13), List(3, 7, 12))

scala> List(List(1,2,3),List(5,6,7),List(14,13,12)).transpose.map(_.sum)
res4: List[Int] = List(20, 21, 22)

注意:transpose 要求所有子集合具有相同的大小。


跟进您的评论。

我不确定你是否理解 zipped 是什么。它将一个元组 (Tuple2) 中的 2 个子集合转换为一个元组集合,然后可以将每个元组赋予一个接受给定类型的 2 个参数的函数。这也适用于 Tuple3 内的 3 个子集合,成为三元组的集合,但这是限制。

另外,我不知道您为什么认为“zipped 是一个函数调用而不是两个”。如果您按照linkRichard Scriven 在他的评论中提出的建议,并比较提供的两种解决方案,您会发现它们具有相同数量的步骤/语句。

在我看来,优点/缺点细分如下:

  • 如果您正在处理不同类型的集合,例如Seq[Int]Seq[Char],那么您需要先获取它们zipped,然后再对它们应用“组合器”功能:f(i1,c1) 然后@987654332 @ 然后f(i3,c3) 等等。
  • 这两种方法都不能很好地处理不同大小的子集合。 transpose 将抛出异常,而 zipped 只是忽略最小子集合的 max-index 之外的所有元素。
  • 如果你的“combiner”函数接受三个以上的参数,那么你就不能使用zipped
  • 如果您的“组合器”将集合作为输入,那么 transpose 可能是更好/更简单的选择。

【讨论】:

  • 聪明的解决方案!你知道这个解决方案是否比使用zipped 更好吗?最终结果似乎相同,只是 zipped 是一个函数调用而不是两个。
  • 我对@9​​87654340@ 的评估已添加到提供的答案中。
猜你喜欢
  • 2022-01-07
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多