从闭包生成值的向量

时间:2012-09-07 12:46:07

标签: r

这种类型的东西在F#中很容易,但我无法弄清楚如何在R中完成它。我想生成一个带有从闭包生成的值的向量。在F#中它的工作原理是这样的。第一个参数是您想要的元素数,第二个参数是闭包的迭代器,最后一个参数是生成值的闭包。在R中这样的事情可能吗?我一直在F#中使用它。

result <- GenerateVector(5, n, function(n){
    n*10
})

会导致:

result =
10
20
30
40
50

2 个答案:

答案 0 :(得分:3)

继续我的评论,如果不需要第二个参数(即你不需要来指定迭代器是什么),那么我们可以这样写GenerateVector():< / p>

GenerateVector <- function(x, FUN) {
    do.call(FUN, list(seq_len(x)))
}

R> GenerateVector(5, FUN = function(n) {n*10})
[1] 10 20 30 40 50

这对您来说是否更有效将取决于FUN是否是矢量化函数(如您的示例)。当然,如果你使用不接受向量的函数,你将会遇到主要的低效问题,所以这可能不是一个很大的问题。

通常,使用常规R约定来编写这些东西要容易得多:

R> 1:5 * 10
[1] 10 20 30 40 50
R> foo <- function(n) n * 10
R> foo(1:5)
[1] 10 20 30 40 50

我的示例中的所有do.call()正在为您编写上面最后两行R代码。

答案 1 :(得分:1)

可能像sapply这样的人可能会这样做:

sapply(1:5, function(n)10*n)
[1] 10 20 30 40 50

相似之处在于sapply将列表作为输入,将函数应用于该列表中的每个元素,并将结果返回到列表中。由于列表本身就是一个向量,因此您可以对输入向量执行相同的操作。

在此示例中,我们使用:运算符构造矢量序列。