2016-09-09 3 views
0

Я хотел бы определить произвольную функцию произвольного числа переменных, например, для 2-х переменных:Применение нескольких переменных функции к вектору R

func2 <- function(time, temp) time + temp 

Я хотел бы сохранить переменную имена, которые имеют значение в задаче (время и температура выше).

Если у меня есть вектор значений для этих переменных, например, в 2-м случае, c (10, 121), я бы хотел применить мою функцию (func2 здесь) и получить результат. Концептуально, что-то подобное,

func2(c(10,121)) 

становится

func2(10,121) 

Есть простой способ для достижения этой цели, для произвольного числа переменных?

Благодаря

+0

Вы исходите из такого языка, как python, который поддерживает splatting? Действительно ли это проблема, расщепляющая вектор при вызове функции? Технически вы можете сделать это с помощью таких вещей, как 'do.call', но это становится довольно грязным в R. Я, вероятно, не рекомендовал бы его, если это абсолютно необходимо. – MrFlick

+0

Можете ли вы указать его как именованный вектор? Например, 'func2 (c (time = 10, temp = 121))'. –

+0

То, что я пытаюсь воспроизвести, - это то, что используется в Mathematica много. В Mathematica выражение, подобное c (10,121), будет иметь «Head», называемый List. Эта голова может быть заменена именем функции с помощью «Применить». (на любом уровне в многомерном массиве). Ответ ниже полезен, но моя конечная цель была более сложной. Я хочу создать многомерную версию «внешнего». Подобно my.outer (func, a_vec, b_vec, c_vec, ..), где функция переменных «a», «b», «c» и т. Д. Будет применена к векторам из внешнего произведения векторов значений для каждой переменной. – SteveK

ответ

1

Вы можете написать вспомогательную функцию, чтобы превратить простой вектор в параметры с помощью do.call

splat <- function(f,v) { 
    do.call(f, as.list(v)) 
} 

splat(func2, c(10,121)) 
+1

Возможно, верните закрытие, чтобы удалить необходимость указывать 'func2' при каждом вызове? –

+0

Это было бы неплохо. Просто не хотел создавать другую переменную, о которой нужно беспокоиться в этом примере. – MrFlick

+0

Спасибо. do.call и as.list выполнит эту работу. Я читал достаточно, чтобы понять это, но не совсем. Еще раз спасибо. – SteveK

0

Это то, что вы ищете?

f = function(f,...) { 
    v = list(...) 
    Reduce(f, v) 
} 

> f(f = "+", x = pi, y = exp(1), z = pi^2) 
15.72948 
+0

Я думаю, что это немного отличается от того, что я пытался сделать. Я думаю, что в ответе выше есть те части, которые мне не хватало. Благодарю. – SteveK

Смежные вопросы