我尝试按如下所述的方式使用累积。我不确定这是使用该函数的正确方法,并且我非常愿意接受任何替代建议来实现所需的结果 - 我只是对这种类型的迭代或如何实现它不够了解。
我试图以交互方式进行计算,然后将之前的迭代结果合并到之前对一系列值的计算中。但是,我还需要为第一次计算提供一个初始值。是否可以利用 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”值。
如果能了解这是否是累积函数应该表现的方式,或者我在构建函数时是否做错了什么,我将不胜感激。特别是有关实现预期结果的任何建议!
再次感谢, 吵架
简短版本:从代码中删除
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)中,只有一个元素。