1

这种类型的事情在 F# 中很容易,但我不知道如何在 R 中做到这一点。我想生成一个带有从闭包生成的值的向量。在 F# 中,它的工作原理是这样的。第一个参数是你想要的元素数量,第二个是闭包的迭代器,最后一个参数是生成值的闭包。在 R 中这样的事情可能吗?我一直在 F# 中使用它。

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

会导致:

result =
10
20
30
40
50
4

2 回答 2

3

根据我的评论,如果不需要第二个参数(即您不需要指定迭代器是什么),那么我们可以这样写GenerateVector()

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 代码。

于 2012-09-07T13:19:18.970 回答
1

可能类似的东西sapply可能会这样做:

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

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

在这个例子中,我们使用:操作符来构造一个向量序列。

于 2012-09-07T13:18:56.160 回答