2015-02-10 1 views
3

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

F <- function(x, FUN){FUN(x)} 

я мог легко пройти простую функцию к нему:

f1 <- function(x){plot(x, 1/x)} 
F(-5:5, f1) 

будет отображать график 1/х.

Предположив у меня был другой, более сложную функцию:

f2 <- function(x, a){plot(x, 1/x^a)} 

f2 имеет 2 аргумента, поэтому не может быть передан непосредственно в F. Но я мог бы сохранить гибкость в так, чтобы, не определяя множество разных функций, я могу быстро построить 1/x^a для любого значения, которое я прихожу. Я не пробовал, для a = 2:

F(-5:5, f2(, 2)) 
F(-5:5, f2(, a=2)) 
F(-5:5, f2(x, 2)) 
F(-5:5, f2(a=2)) 

Но ни одна из этих работ. у кого-нибудь есть решение? (Я могу установить значение по умолчанию для a в f2, но тогда я не смог запустить его с другим значением a).

Конкретная контекст: У меня есть функция, которая будет найти обратное преобразование Лапласа функции, принимая функцию в качестве аргумента, который, как ожидается, иметь один аргумент (переменная Лапласа, р). Я могу инвертировать функцию, например, f1. Но я пытаюсь инвертировать функцию транспорта загрязняющих веществ в грунтовых водах. Этот процесс зависит от множества других параметров, таких как скорость воды и пройденное расстояние. Поэтому я хотел бы иметь возможность передавать многопараметрическую функцию для инверсии Лапласа таким образом, чтобы все параметры, кроме параметра Лапласа p, были фиксированными. В конечном счете, я хотел бы сделать этот процесс много раз с разными значениями скорости и т. Д., Поэтому мне нужен жидкий способ изменения используемых «фиксированных» параметров.

Заранее спасибо за любую помощь, Кристофер

+0

Посмотрите на '? DotsMethods' и'? Do.call'. Объединение двух должно дать вам решение. – shadow

+0

Как насчет использования многоточия 'F <- function (x, FUN, ...) {FUN (x, ...)}; F (-5: 5, f2, a = 4) '? – lukeA

+0

Карри - это путь. –

ответ

3

Просто определить генератор функции:

genFunc = function(a) 
{ 
    function(x) plot(x, 1/x^a) 
} 

F(-5:5, genFunc(2)) 

Или используйте Curry из functional пакета для исправления параметров, которые вы хотите и приправить ваши блюда:

library(functional) 
F(-5:5, Curry(f2, a=2)) 
+0

Спасибо, полковник Бовель. Оба решения просты и эффективны. – Bazz

+0

Нет проблем, Curry - это более высокий уровень и позволяет писать меньше кода :) –

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