这种类型的事情在 F# 中很容易,但我不知道如何在 R 中做到这一点。我想生成一个带有从闭包生成的值的向量。在 F# 中,它的工作原理是这样的。第一个参数是你想要的元素数量,第二个是闭包的迭代器,最后一个参数是生成值的闭包。在 R 中这样的事情可能吗?我一直在 F# 中使用它。
result <- GenerateVector(5, n, function(n){
n*10
})
会导致:
result =
10
20
30
40
50
这种类型的事情在 F# 中很容易,但我不知道如何在 R 中做到这一点。我想生成一个带有从闭包生成的值的向量。在 F# 中,它的工作原理是这样的。第一个参数是你想要的元素数量,第二个是闭包的迭代器,最后一个参数是生成值的闭包。在 R 中这样的事情可能吗?我一直在 F# 中使用它。
result <- GenerateVector(5, n, function(n){
n*10
})
会导致:
result =
10
20
30
40
50
根据我的评论,如果不需要第二个参数(即您不需要指定迭代器是什么),那么我们可以这样写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 代码。
可能类似的东西sapply
可能会这样做:
sapply(1:5, function(n)10*n)
[1] 10 20 30 40 50
相似之处在于sapply
将列表作为输入,将函数应用于该列表中的每个元素,并在列表中返回结果。由于列表本身就是一个向量,因此您可以对输入向量执行相同的操作。
在这个例子中,我们使用:
操作符来构造一个向量序列。