Я подозреваю, что это очевидная вещь, но я не могу понять, как это сделать, или найти любую информацию, которая подходит для моего случая в этом сообществе или в другом месте.
vs
- этофрейм данных, содержащий переменные:
cs <- seq(0,1,0.2)
vs <- expand.grid(cs,cs,cs)
[Кстати, уже на этом этапе у меня есть сомнения: может ли команда expand.grid
быть записана более эффективно, поскольку у меня 3 раза один и тот же вектор cs
?Но ладно, не главное.]
fn
- это пример функции, принимающей вектор в качестве входного (фактический намного сложнее, а вектор имеет длину 16):
fn <- function(p) {(p[1]+exp(p[2])+p[3]^2)/(sum(exp(p)))}
Теперь я хочу применить fn
к vs
, в основном делая вектор для передачи на fn
из каждой строки vs
.
Для 1 строки это очевидно:
fn(c(vs[1,1],vs[1,2],vs[1,3]))
[1] -0.3333333
Но что, если я хочу сделать это автоматически для всех строк в vs
?
После ознакомления с документацией do.call
показался очевидным выбором, и действительно, когда я использовал пример функции(paste
), это сработало:
head(do.call(paste,vs))
[1] "0 0 0" "0.2 0 0" "0.4 0 0"
[4] "0.6 0 0" "0.8 0 0" "1 0 0"
Конечно, это не сработало для fn
, но я подумал, что это связано с тем, что paste
принимает n аргументов, тогда как моя функция принимает1 аргумент.
Вот где я застрял.Я думал, что смогу создать новый столбец, содержащий векторы, сделанные из 3 столбцов vs
, а затем просто запустить на нем fn
.Но я не знаю, как это сделать.Я пытался подать заявку, сделать звонок с c
или с list
, но безрезультатно.
Есть предложения?
Спасибо!