如何在R

时间:2016-05-25 18:40:19

标签: r apply lapply sapply mapply

我是R的新手,因此我是应用函数的新手。我没有在任何地方找到这个问题的答案,即使我有一种(不那么优雅)的解决方法。

考虑这个虚拟代码:

my.fun <- function(vector1, vector2, vector3 = NULL) {
    # do stuff with the vectors
}

list1 <- mapply(FUN = my.fun, arg1, arg2, list(arg3), SIMPLIFY = FALSE)

假设arg1和arg2是我想在mapply函数内迭代的列表(长度相同),但是arg3只是一个我想在my.fun()中使用而不进行迭代的向量。我的问题是:如何在所有mapply函数迭代中将arg3放在my.fun()中?为了澄清,my.fun()中的vector3应该等于arg3,在my.fun()之外。

这样做的一种方法是:

list1 <- mapply(FUN = my.fun, arg1, arg2, rep(list(arg3), length(arg1)), SIMPLIFY = FALSE)

但看起来应该有更优雅的方式。

有没有办法指定哪些参数是迭代的,哪些不是?或者做同样的事情(使用apply-family函数)而不必创建相同内容的大量副本?

感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

mapply()有一个MoreArgs=参数用于此目的。

例如:

par(mfcol=c(2,2), ann=FALSE, mar=c(1,1,1,1))
mapply(plot, x=1:4, y=4:1, col=1:4,
       MoreArgs=list(xlim=c(1,4), ylim=c(1,4), pch=16, cex=3))

enter image description here

答案 1 :(得分:0)

执行此操作的一种方法是使用Map函数和匿名函数。这是一个例子

myFunction <- function(arg1, arg2, arg3) {
  arg1 + arg2 + arg3
}

arg1 <- 1:5
arg2 <- 5:1
arg3 <- 1

Map(function(arg1, arg2) myFunction(arg1, arg2, arg3=arg3), arg1, arg2)