Я экспериментирую с использованием функций в фреймах данных (tidyverse tibbles) в R и столкнулся с некоторыми трудностями. Ниже приведен минимальный (тривиальный) пример моей проблемы.
Предположим, у меня есть функция, которая принимает три аргумента: x
и y
- это числа, а f
- это функция. Он выполняет f(x) + y
и возвращает вывод:
func_then_add = function(x, y, f) {
result = f(x) + y
return(result)
}
И у меня есть несколько простых функций, которые он может использовать как f
:
squarer = function(x) {
result = x^2
return(result)
}
cuber = function(x) {
result = x^3
return(result)
}
Сделано само по себе, func_then_add
работает как рекламируется:
> func_then_add(5, 2, squarer)
[1] 27
> func_then_add(6, 11, cuber)
[1] 227
Но допустим, у меня есть датафрейм (tidyverse tibble) с двумя столбцами для числовых аргументов и одним столбцом, для которого я хочу функцию:
library(tidyverse)
library(magrittr)
test_frame = tribble(
~arg_1, ~arg_2, ~func,
5, 2, squarer,
6, 11, cuber
)
> test_frame
# A tibble: 2 x 3
arg_1 arg_2 func
<dbl> <dbl> <list>
1 5 2 <fn>
2 6 11 <fn>
Затем я хочу создать еще один столбец result
, равный func_then_add
, примененный к этим трем столбцам. Это должно быть 27
и 227
, как раньше. Но когда я пытаюсь это сделать, я получаю сообщение об ошибке:
> test_frame %>% mutate(result=func_then_add(.$arg_1, .$arg_2, .$func))
Error in f(x) : could not find function "f"
Почему это происходит, и как мне получить то, что я хочу правильно? Признаюсь, я новичок в "функциональном программировании", поэтому, возможно, я просто делаю очевидную синтаксическую ошибку ...