Аналогично другим ответам. Однако функции, которые работают с побочным эффектом, исключают такие вещи, как: присвоение новой переменной (один ответ предлагает способ сделать это) или работа в конвейере (например, %>%
).
Я предлагаю без побочных эффектов (<<-
и assign
).
myfunction <- function(x, d, equation, ...) {
x$V <- eval(substitute(equation), envir = x)
x
}
x <- data.frame(d = 1:5)
myfunction(x, x$d, d*5^0.02)
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
Исходный x
не изменился. Одно из преимуществ использования парадигмы функционал тиски побочный эффект состоит в том, что он будет лучше течь в (скажем) каналах:
library(dplyr)
x %>%
myfunction(d, d*5^0.02)
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
, тогда как использование побочного эффекта может не влияет на x
, что предназначено / желательно.
x %>%
filter(between(d, 2, 4)) %>%
myfunction(d, d*5^0.02)
# d V
# 1 2 2.065425
# 2 3 3.098137
# 3 4 4.13085
(Это не работает при использовании побочного эффекта.)
В качестве альтернативы, у нас уже есть функция в базе R для этого:
within(x, { V = d*5^0.02 })
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
transform(x, V = d*5^0.02 )
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562