如何解决如何避免在R
我是R编程的初学者。最近,我编写了一个用户定义的函数,如下所示:
foo <- function(x){
power <- 1:4
sum(x^power)
}
当x是一个整数时,此功能可以正常使用。例如,当x = 1
时,结果为4;当x = 10
时,结果为11110。但是,此函数不适用于矢量。例如,当x <- c(1,10)
时,结果是10102,这不是我想要的。我期望的结果是一个向量,例如4 11110
。我知道可以通过在函数上使用sapply()
或在函数内部添加for循环来解决此问题,但是我认为可能存在另一种无需使用循环或“应用”函数即可重写函数的方法。我尝试了多种方法重写函数,但是没有任何效果,有人可以帮助我解决问题吗?谢谢!
解决方法
从数学上讲,一种简单而直接的方法是像下面这样重写foo
函数
foo <- function(x) {
power <- 1:4
ifelse(x==1,max(power),x*(x**(max(power))-1)/(x-1))
}
给出
> foo(c(1,10))
[1] 4 11110
,
我认为没有办法避免任何形式的隐式或显式循环,因为power
是向量,而您将x
传递给它是另一个向量。
以下是几种选择:
- 您最好的选择是
sapply
(您已经知道了)。
sapply(c(1,10),foo)
#[1] 4 11110
- 另一种方法是使用
Vectorize
,在该位置您无法“看到”该循环,但由于它是mapply
的包装,因此仍在下面循环。
Vectorize(foo)(c(1,10))
#[1] 4 11110
- 使用
outer
:
foo <- function(x){
power <- 1:4
rowSums(outer(x,power,`^`))
}
foo(c(1,10))
#[1] 4 11110
显然,您也可以编写一个简单的for
循环并将c(1,10)
传递给它。
这有效:
foo <- function(x,power = 1:4){
ind <- 1 + seq_along(power)
power <- matrix(rep(power,length(x)),nrow = length(x),byrow = T)
x <- as.matrix(x)
m <- cbind(x,power)
m <- m[,1]^m[,ind]
v <- rowSums(m)
return(v)
}
foo(x = c(1,10))
## [1] 4 11110
运行速度比使用sapply(x foo)
快8.5倍(当foo
是长度== 1,000,000的向量时)。这里有点晚了,所以我不知道您是否可以更好地优化内部。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。