让purrr::accumulate()快速运行还是其他选择? 问题

让purrr::accumulate()快速运行还是其他选择? 问题,r,for-loop,purrr,R,For Loop,Purrr,我正在寻找一种更快的替代R中for循环的方法。具体来说,这种方法可以提供由于加法而产生的向量减少的中间结果purrr::accumulate()起作用,但速度似乎很慢。下面显示了一个可复制的示例 功能 带for循环 累积\u值这里有一个尝试。我使用{bench}-包来提供更精确的微基准 库(purrr) 累积值您可以尝试使用Reduce(函数(x,y)max(0,x+y),calculation,acculate=TRUE)或使用cummax(计算)@akrun谢谢您的评论Reduce()在这些

我正在寻找一种更快的替代R中for循环的方法。具体来说,这种方法可以提供由于加法而产生的向量减少的中间结果
purrr::accumulate()
起作用,但速度似乎很慢。下面显示了一个可复制的示例

功能 带for循环
累积\u值这里有一个尝试。我使用
{bench}
-包来提供更精确的微基准

库(purrr)

累积值您可以尝试使用
Reduce(函数(x,y)max(0,x+y),calculation,acculate=TRUE)
或使用
cummax(计算)
@akrun谢谢您的评论
Reduce()
在这些数据上比
purrr::acculate()
快,但仍然比
for loop
慢<代码>累积最大()/<代码>不提供相同的结果。可能需要<代码> CuMax(PMAX(0,计算))<代码> >代码> CUMAX(PMAX(0,计算)< <代码>)不提供相同的结果。使用C++ <代码> STD::累积< /代码> <代码> Rcpp < /Cord>包:
accumulate_values <- function(time_vector, 
                              input_vector, 
                              list_of_parameters)
{

  number_samples <- length(time_vector)
  time_steps <- c(0, diff(time_vector))

  calculation <- (list_of_parameters$K * input_vector - list_of_parameters$M) * time_steps

  accumulated_values <- rep(0, number_samples)
  for (i in 2:number_samples) {
    accumulated_values[i] <- max(0, accumulated_values[i-1] + calculation[i])

  }

  return(accumulated_values)
}
library(tidyverse)
accumulate_values_purrr <- function(time_vector, 
                              input_vector, 
                              list_of_parameters)
{
  number_samples <- length(time_vector)
  time_steps <- c(0, diff(time_vector))
    calculation <- (list_of_parameters$K * input_vector - list_of_parameters$M) * time_steps

  # accumulated_values <- rep(0, number_samples)
  # for (i in 2:number_samples) {
  #   accumulated_values[i] <- max(0, accumulated_values[i-1] + calculation[i])
  #   
  # }
  accumulated_values <- calculation %>% purrr::accumulate(function(x, y) max(0, x + y))

  return(accumulated_values)
}  
# Data
Nums <- 1000000
my_time_vector <- seq(1, Nums, by = 1)
my_input_vector <- rnorm(Nums)
my_list_of_parameters <- list(K = 5, M = 0.01)

# Results
set.seed(1987)
library(tictoc)
# With for-loop
tic()
answer1 <- accumulate_values(my_time_vector, 
                  my_input_vector, 
                  my_list_of_parameters)
toc()
## 1.73 sec elapsed

# With purrr::accumulate
tic()
answer2 <- accumulate_values_purrr(my_time_vector, 
                  my_input_vector, 
                  my_list_of_parameters)
toc()
## 5.93 sec elapsed

identical(answer1, answer2)
## [1] TRUE