矢量元素的产物

时间:2012-09-25 02:38:13

标签: r

我想编写一个函数,给定一个向量v计算v中所有条目的乘积(R中有一个函数可以执行此操作,但我想自己编写一个。)

但我尝试了如何获取向量中任何元素的产品?

product <- function(v){
    out <- 1
    for(i in 1:length(v)){
       out <- out*v[i]
    }
    out
}

2 个答案:

答案 0 :(得分:4)

如果使用...作为函数的参数,则可以传递几个对象或只传递一个。在函数内部,您可以转换为列表并使用Reduce以递归方式将函数(*)应用于列表。如果您将listunlistas.list合并,则可以使其非常通用。以下内容适用于矢量,或2个或更多数字,或矢量和单个数字的混合。

> product <- function(...) Reduce("*", as.list(unlist(list(...))))
> product(2, 7, 3)
[1] 42
> product(c(2, 7, 3))
[1] 42
> product(2, c(7, 3))
[1] 42

答案 1 :(得分:1)

使用Recall进行尾递归:

 prd2 <- function(x)
     if(length(x) == 2) { x[1] *x[-1] } else x[1] * Recall(x[-1])
 prd2(c(2,3,4))
#[1] 24