Изменить функцию как параметр, прежде чем оценивать ее в R? - PullRequest
4 голосов
/ 07 апреля 2010

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

Вот псевдокод того, чего я надеюсь достичь:

test.func <- function(a, b) {
    # here I want to alter the b expression before evaluating it:
    b(..., val1=a)
}

Учитывая, что вызов функции передан в b, я хочу добавить a в качестве другого параметра, при этом не нужно всегда указывать ... в вызове b. Таким образом, результат этого test.func вызова должен быть:

test.func(a="a", b=paste(1, 2))
"1"  "2"  "a"

Редактировать :

Другим способом, который я мог бы увидеть, делая что-то подобное, было бы, если бы я мог назначить дополнительный параметр в пределах родительской функции (опять же, как псевдокод); в этом случае a будет в пределах t1 и, следовательно, t2, но не будет глобально назначен:

t2 <- function(...) {
  paste(a=a, ...)
}

t1 <- function(a, b) {
  local( { a <<- a; b } )
}

t1(a="a", b=t2(1, 2))

Это немного похоже на карри в том смысле, что я вкладываю параметр в саму функцию.

Редактировать 2 :

Просто добавлю еще один комментарий к этому: я понимаю, что одним из связанных подходов может быть использование « программирования на основе прототипов » таким образом, чтобы все было унаследовано (что может быть достигнуто с помощью прото пакет ). Но я надеялся на более простой способ простого изменения входных параметров перед вычислением в R.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

Вы проверяли substitute? Я не знаю, удовлетворяет ли он вашим потребностям, но вы можете использовать тот факт, что он возвращает скрытую list структуру, которую вы можете изменить, как показано ниже

test.func <- function(a, b) {
    f <- substitute(b)
    f[["val1"]] <- a
    eval(f)
}

test.func(a="a", b=paste(1, 2))
# "1 2 a"
0 голосов
/ 07 апреля 2010

Что вы хотите сделать с выражением B? Вы хотите динамически добавлять поведение? Тогда в вашей задаче есть шаблон декоратора. Хотите опционально добавить поведение? Proxy. Нужно поменять одно поведение на другое при определенных обстоятельствах? Стратегия.

Вам гораздо лучше полагаться на шаблоны проектирования - которые работают и делают вас более эффективными независимо от используемого вами языка - чем вы пытаетесь использовать какую-то специфическую для языка функцию, которая позволяет вам изменять поведение стратегии.

...