изменить основной текст существующих функциональных объектов - PullRequest
7 голосов
/ 04 июня 2010

У меня есть несколько файлов .Rdata, которые содержат сохраненные функции, как определено в прибл. (*).

Некоторые из файлов сохранения предшествуют переходу с приблизительного значения из пакета "base" в "stats", поэтому тело имеет

PACKAGE = "base"

и неправильный пакет вызывает сбой функции. Я могу исправить (myfun) и просто заменить "base" на "stats", но я хочу более аккуратный автоматический способ.

Можно ли как-то сделать это с помощью gsub () и body ()?

Я могу получить основной текст и заменить его на

as.character(body(myfun))

но я не знаю, как превратить это обратно в "вызов" и заменить определение.

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

Редактировать: я нашел это здесь

Как можно редактировать функцию в R?

1 Ответ

4 голосов
/ 29 сентября 2014

Используйте функцию substitute.

Например:

myfun <- function(x,y) {
  result <- list(x+y,x*y)
  return(result)
}

Используя body, обработайте myfun как список, чтобы выбрать то, что вы хотели бы изменить в функции:

> body(myfun)[[2]][[3]][[2]]
x + y

Когда вы изменяете это, вы должны использовать функцию substitute, чтобы заменить часть функции объектом call или name, в зависимости от ситуации. Замена символьными строками не работает, поскольку функции не сохраняются и не обрабатываются как символьные строки.

body(myfun)[[2]][[3]][[2]] <- substitute(2*x)

Теперь выбранный фрагмент функции заменен:

> myfun
function (x, y) 
{
    result <- list(2 * x, x * y)
    return(result)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...