这种类型的东西在F#中很容易,但我无法弄清楚如何在R中完成它。我想生成一个带有从闭包生成的值的向量。在F#中它的工作原理是这样的。第一个参数是您想要的元素数,第二个参数是闭包的迭代器,最后一个参数是生成值的闭包。在R中这样的事情可能吗?我一直在F#中使用它。
result <- GenerateVector(5, n, function(n){
n*10
})
会导致:
result =
10
20
30
40
50
答案 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
将列表作为输入,将函数应用于该列表中的每个元素,并将结果返回到列表中。由于列表本身就是一个向量,因此您可以对输入向量执行相同的操作。
在此示例中,我们使用:
运算符构造矢量序列。