2012-09-25 112 views
0

我想写一个函数,给定一个矢量v计算v中所有条目的乘积(R中有一个函数是这样做的,但我想自己写一个函数。 )矢量元素的产品

但是我试过如何获得矢量中任何元素的产品?

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

你的代码看起来不错,对我的作品。当你尝试'产品(c(1,2,3))'时,你会得到什么? – Gregor

+0

@shujaa它出来1 – Lekh

+0

我用你的代码得到'6'。我还用'Reduce(“*”,as.list(c(1,2,3)))' – GSee

回答

4

如果使用...作为参数传递给你的功能,你可以通过它几个对象或只是一个。在函数内部,您可以转换为列表并使用Reduce递归地将函数(*)应用于列表。如果你结合list,unlistas.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 
+0

我可能错过了一个角落的情况下,但会'product < - function(...)Reduce(“*”,c(...))'做基本上相同的事情? – Dason

+0

我猜如果有列表输入,而不是只有载体,我的方法不会工作,但你仍然会。 – Dason

0

的尾递归的使用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