我想了解一下R中的函数式编程。 为此,我想编写vandermonde matrix计算,因为它可能涉及一些结构。
以命令式的方式:
vandermonde.direct <- function (alpha, n)
{
if (!is.vector(alpha)) stop("argument alpha is not a vector")
if (!is.numeric(alpha)) stop("argument n is not a numeric vector")
m <- length(alpha)
V <- matrix(0, nrow = m, ncol = n)
V[, 1] <- rep(1, m)
j <- 2
while (j <= n) {
V[, j] <- alpha^(j - 1)
j <- j + 1
}
return(V)
}
你如何在功能风格的R中优雅地写出来?
以下不起作用:
x10 <- runif(10)
n <- 3
Reduce(cbind, aaply(seq_len(n-1),1, function (i) { function (x) {x**i}}), matrix(1,length(x10),1))
因为它告诉我Error: Results must have one or more dimensions.
有关从i in seq_len(3-1)
到函数x -> x**i.
的函数列表
答案 0 :(得分:2)
使用Reduce
执行此任务似乎不太自然。
该错误消息是由aaply
引起的,它试图返回一个数组:
您可以使用alply
代替;你还需要在某个地方调用你的函数。
以下是一些惯用的替代方案:
outer( x10, 0:n, `^` )
t(sapply( x10, function(u) u^(0:n) ))
sapply( 0:3, function(k) x10^k )
答案 1 :(得分:2)
这是Reduce
:
m <- as.data.frame(Reduce(f=function(left, right) left * x10,
x=1:(n-1), init=rep(1,length(x10)), accumulate=TRUE))
names(m) <- 1:n - 1
答案 2 :(得分:1)
这是另一个选项,它使用R的环境特性:
vdm <- function(a)
{
function(i, j) a[i]^(j-1)
}
这适用于任意n
(列数)。
要为给定的a
创建“Vandermonde功能”,请使用:
v <- vdm(a=c(10,100))
要一次构建一个矩阵,请使用:
> outer(1:3, 1:4, v)
[,1] [,2] [,3] [,4]
[1,] 1 10 100 1e+03
[2,] 1 100 10000 1e+06
[3,] 1 NA NA NA
请注意,索引a[3]
超出范围,因此返回NA
(第一列除外,1
)。