R应用动态参数
我只是想知道是否可以使用apply函数,以便在使用下一个I索引之前,刷新其中一个参数。让我介绍一个例子: 我有一个简单的10元素向量:R应用动态参数,r,loops,dynamic,arguments,apply,R,Loops,Dynamic,Arguments,Apply,我只是想知道是否可以使用apply函数,以便在使用下一个I索引之前,刷新其中一个参数。让我介绍一个例子: 我有一个简单的10元素向量: a<-c(1,rep(NA,9)) 结果是向量1,3,…19 我知道在for循环中很容易实现,但我会尝试应用它,看看它是否是一个更快的解决方案 谢谢你的建议 Bart如果我理解正确,下面的代码是您问题的可能解决方案。正如@jogo在您问题的评论中提到的,深度分配函数如果我理解正确,下面的代码是您问题的可能解决方案。就我所知,@jogo在对您的问题的评论中
a<-c(1,rep(NA,9))
结果是向量1,3,…19
我知道在for循环中很容易实现,但我会尝试应用它,看看它是否是一个更快的解决方案
谢谢你的建议
Bart如果我理解正确,下面的代码是您问题的可能解决方案。正如@jogo在您问题的评论中提到的,深度分配函数
如果我理解正确,下面的代码是您问题的可能解决方案。就我所知,@jogo在对您的问题的评论中提到了deep assign函数,您无法使用*apply族进行此类计算
编辑:行动,刚刚看到答案。让我换一句话,没有全局分配就无法完成“据我所知,您无法使用*apply族进行此类计算
编辑:行动,刚刚看到答案。让我重新表述一下,没有全局分配就无法完成“最好的解决方案总是矢量化:1+(0:9)*2
有副作用的函数是危险的当然矢量化是最好的,但真正的问题更复杂。我在以下步骤中添加的内容取决于以前的结果(以前填充的a值)-这里的示例非常简单,只需呈现您对向量a
的构成不清楚的想法。例如,它的哪些属性是可变的(第一个值、任意值、长度)。例如@Roland给出了解决方案。请提供一个具体且具有代表性的示例*apply
循环仍然是循环,速度不比编写良好的for
循环快(除了vapply
)。但是,如果您的问题是真正的递归问题,那么使用编译语言(即Rcpp)通常是最简单也是最好的。最好的解决方案总是矢量化:1+(0:9)*2
具有副作用的函数是危险的确定矢量化是最好的,但真正的问题更复杂。我在以下步骤中添加的内容取决于以前的结果(以前填充的a值)-这里的示例非常简单,只需呈现您对向量a
的构成不清楚的想法。例如,它的哪些属性是可变的(第一个值、任意值、长度)。例如@Roland给出了解决方案。请提供一个具体且具有代表性的示例*apply
循环仍然是循环,速度不比编写良好的for
循环快(除了vapply
)。但是,如果您的问题是真正的递归问题,那么使用编译语言(即Rcpp)通常是最简单也是最好的。非常感谢!我一定会尝试你的解决方案,如果它真的能节省我一些计算时间的话,我会带着信息回来的。非常感谢!我一定会尝试你的解决方案,如果它真的能节省我一些计算时间的话,我会带着信息回来的。谢谢你的评论!不幸的是,我在处理SDE时没有解析解,但我同意,当应用到简单问题时,你的解决方案是非常简洁的。谢谢你的评论!不幸的是,我在处理SDE时没有解析解,但我可以同意,当应用于简单问题时,你的解决方案是相当简洁的。
fun<-function(i,vec){
vec[i]<-2+cumsum(vec)[i-1]
a<<-vec
}
sapply(2:10,fun,vec=a)
a <- c(1,rep(NA,9))
fun<-function(i,vec){
a[i] <<- 2+cumsum(vec)[i-1]
}
sapply(seq_along(a)[-1], function(i) fun(i,a))
loopSoln <- function() {
a <- c(1,rep(NA,9))
for(i in seq_along(a)[-1]) {
a[i] <- 2+cumsum(a)[i-1]
}
return(a)
}
fun<-function(i,vec){
a[i] <<- 2+cumsum(vec)[i-1]
}
applySoln <- function() {
a <- c(1,rep(NA,9))
sapply(seq_along(a)[-1], function(i) fun(i,a))
return(a)
}
microbenchmark::microbenchmark(loopSoln(), applySoln())
Unit: microseconds
expr min lq mean median uq max neval
loopSoln() 28.915 30.6960 34.36206 32.5115 33.9085 99.525 100
applySoln() 77.664 80.9815 88.13986 83.1465 85.3815 207.569 100
vec[i] = 2 + cumsum(vec[i-1])
vec[i]= 2 +2 +cumsum(vec[i-2])+cumsum(vec[i-2])
vec[i]=2*i +vec[1]*i
non.rec <- function(x,initial) {2*x+initial*x}
lapply(2:10,non.rec,initial=1)