仅针对第一个实例累积 .init

问题描述 投票:0回答:1

我尝试按如下所述的方式使用累积。我不确定这是使用该函数的正确方法,并且我非常愿意接受任何替代建议来实现所需的结果 - 我只是对这种类型的迭代或如何实现它不够了解。

我试图以交互方式进行计算,然后将之前的迭代结果合并到之前对一系列值的计算中。但是,我还需要为第一次计算提供一个初始值。是否可以利用 purrr::accumulates .init 及其先前函数行为的默认累积结果?

我有以下示例数据:

change <- c(-65.007602, 
             46.957756,
            -49.028273, 
            -162.412249,  
            -28.002166,  
             116.749729,  
            -59.090951,   
             60.309175,   
             55.703313,   
            -6.434954)

以及以下功能:

t2 <- function(t1, changeval) {
  change.quant <- ((1/100)*t1*abs(changeval)+t1)-t1
    ifelse(str_detect(changeval, "-") == T, 
         t1 - change.quant, 
         t1 + change.quant)
} 

该函数对于单个实例似乎可以正常工作:


t2(150000, -65.007602) 
[1] 52488.6

我对初始 t1 值有一个预定值,示例中将仅使用 150000。

据我了解, purrr::accumulate 将使用前一个函数的初始值或结果。因此,如果我想提供初始起始值,我可以使用 .init :

change %>% 
  as.tibble() %>% 
  accumulate(t2, .init = 150000)

但是,这将成为所有交互的起始值。我想知道是否可以在第一个实例中使用 .init 行为(可以这么说,“让球滚动”),然后返回到其累积结果行为?

或者是否有其他方法可以实现这一目标?

这个过程本身我打算迭代,所以越简单越好。

感谢任何建议,即使它只是为我指明正确的方向(即,我想要实现的目标的正确术语等)

谢谢

更新

感谢发帖者的反馈,我正在下面更新,更好地描述我的期望和我得到的内容。

注意:还使用 ifelse 将上面的原始 if/else 函数更新为工作版本,因为在发布过程中我睡眼惺忪的咖啡因缺乏状态,我包含了一个早期的迭代 - 抱歉。

采用原始 t2 函数的改进版本(以下建议):

t2 <- function(t1, changeval) {
  change.quant <- ((1/100)*t1*abs(changeval)+t1)-t1
  t1 + sign(changeval) * change.quant
} 

这给出了初始结果:

t2(150000, -65.007602)
[1] 52488.6

根据这个值,如果accumulate通过获取该函数的结果并使用它来计算下一次迭代来工作,那么下一个t1值应该是'52488.6'。向量中的下一个更改值是“46.957756”。使用功能:

t2(52488.6, 46.957756)
[1] 77136.07

但是,当我使用accumulate时,我得到以下结果:

change %>% 
  as.tibble() %>% 
  accumulate(t2, .init = 150000)

[1]   52488.60  220436.63   76457.59  -93618.37  107996.75  325124.59   61363.57  240463.76  233554.97  140347.57

因此,我得到的是“220436.63”,而不是“77136.07”,如果我使用该函数来计算:

t2(150000, 46.957756)
[1] 220436.6 

也就是说,这里似乎再次使用初始的“150000”值进行计算,而不是第一次迭代中的“52488.60”值。

如果能了解这是否是累积函数应该表现的方式,或者我在构建函数时是否做错了什么,我将不胜感激。特别是有关实现预期结果的任何建议!

再次感谢, 吵架

r purrr accumulate
1个回答
0
投票

简短版本:从代码中删除

as.tibble() %>%
行,您将得到正确的答案。

长版: 在这种情况下,我以一种无声的、难以理解的方式失败了。如果我们得到输入的长度,我们可以看到提示:

 change %>% 
  as.tibble() %>% 
  length()
# [1] 1

我猜你期望它是 10,但 tibbles 是嵌套列表,并且

change %>% as.tibble()
类似于:

list(
  change = c(-65.007602, 46.957756, -49.028273, -162.412249, -28.002166, 116.749729, -59.090951, 60.309175, 55.703313, -6.434954)
)

正如 Ritchie 在评论中所说,加法、乘法、获取某物的绝对值等算术函数可以与列表和向量一起使用,这在某些情况下非常有用 - 例如,做类似

1 + c(2, 3, 4)
的事情。但在这种情况下,这意味着我们得到了错误的答案,并且作为用户,我们不清楚为什么它没有给我们正确的答案。

总而言之,在您的示例中,accumulate 似乎对每个值都使用了 init 值,因为它对每个值运行计算(您是对的!),但只执行一次(即它没有迭代)。它没有迭代,因为在父列表(即 tibble)中,只有一个元素。

© www.soinside.com 2019 - 2024. All rights reserved.