Возможно, это не то, что вы ищете, но вот простой способ обновить одно значение и рассчитать столбцы соответственно. Я буду использовать пакет data.table
, поскольку он позволяет обновлять столбцы по ссылке, по строке, поэтому вам не нужно пересчитывать весь столбец (столбцы) при каждом обновлении.
Сначала я добавляю атрибут к a
, определяющий вычисляемые столбцы, которые должны быть обновлены. Затем я определяю функцию для обновления отдельных значений, которая распознает этот атрибут и пересчитывает столбцы, как определено.
a <- data.frame(p = c(1:3),q = c(3:5))
a <- a %>% mutate(r = p*q, s = p/q - 4)
library(data.table)
setDT(a)
attr(a, 'refresh.cols') <- c(r = 'p*q', s = 'p/q - 4')
df.update <- function(df, row, ...){
l <- list(...)
Map(function(x, nm) df[row, eval(parse(text = paste(nm, ':=', x)))]
, l, names(l))
df[row, names(attr(a, "refresh.cols")) :=
lapply(attr(a, "refresh.cols"), function(x) eval(parse(text = x)))]
}
a
# p q r s
# 1: 1 3 3 -3.666667
# 2: 2 4 8 -3.500000
# 3: 3 5 15 -3.400000
a %>% df.update(row = 1, p = 2)
a
# p q r s
# 1: 2 3 6 -3.333333
# 2: 2 4 8 -3.500000
# 3: 3 5 15 -3.400000
a %>% df.update(row = 3, p = 6, q = 7)
a
# p q r s
# 1: 2 3 6 -3.333333
# 2: 2 4 8 -3.500000
# 3: 6 7 42 -3.142857
a %>% df.update(row = 2, p = 9, q = 'p/3 + 1')
a
# p q r s
# 1: 2 3 6 -3.333333
# 2: 9 4 36 -1.750000
# 3: 6 7 42 -3.142857