Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R应用动态参数_R_Loops_Dynamic_Arguments_Apply - Fatal编程技术网

R应用动态参数

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在对您的问题的评论中

我只是想知道是否可以使用apply函数,以便在使用下一个I索引之前,刷新其中一个参数。让我介绍一个例子:

我有一个简单的10元素向量:

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)