Подтвердить что ты не робот

Изменение функции пакета R для текущего сеанса R; assignInNamespace не ведет себя как fixInNamespace?

Я хотел бы иметь возможность изменять скрытую функцию внутри R-пакета "автоматическим" способом, например, с помощью fixInNamespace, но где я могу написать код заранее, а не в окне редактирования, которое fixInNamespace делает. Я думаю, что assignInNamespace мог бы выполнить эту работу, но в настоящее время он не работает. Вот пример проблемы.

require(quantmod)

getSymbols("AAPL")

chartSeries(AAPL)  # Works fine up to here. 

Теперь скажите, что я хочу, чтобы тики yaxis рисовались в левой части графика, а не справа. Это можно сделать, изменив исходный код в пакете quantmod. Соответствующий код для изменения макета сюжета находится в скрытой функции квантования chartSeries.chob.

Это можно сделать, выполнив следующие действия:

fixInNamespace("chartSeries.chob", ns = "quantmod")

и в окне редактирования вручную измените строку 117 с axis(4) на axis(2), нажмите "ОК" и снова запустите chartSeries(AAPL) (теперь на левой стороне графика будут отображаться метки оси y). Все хорошо, сюжет генерируется так, как ожидалось, никаких проблем.

Но... теперь предположим, что я хочу заранее модифицировать chartSeries.chob(автоматическим способом), предположительно, используя измененную версию функции chartSeries.chob, не используя окно редактирования. Например, мне может понадобиться модифицировать десятки строк в функции, и каждый раз открывать окно редактирования для нового сеанса R не представляется возможным.

Как я могу это сделать?

Сейчас я делаю это, что не работает:

assignInNamespace("chartSeries.chob", value = chartSeries.chob2, ns = "quantmod")

где я получаю из консоли полную копию chartSeries.chob с измененным кодом в строке 117.

chartSeries.chob2 <- function (x) 
{
old.par <- par(c("pty", "mar", "xpd", "bg", "xaxs", "las", 
                   "col.axis", "fg"))
  on.exit(par(old.par))
....

[Edit On 117:] axis(2)
...
}

Когда я запускаюсь с консоли:

chartSeries(AAPL)

или

quantmod:::chartSeries(AAPL)

Я получаю ошибки - вызовы других функций в quantmod изнутри функции chartSeries.chob не найдены, по-видимому, потому что отредактированная функция chartSeries.chob не находится в пространстве имен quantmod?

Я замечаю, что при вводе quantmod:::chartSeries.chob из консоли после команды assignInNamespace в конце определения функции нет environment: namespace:quantmod.

Но если я применяю метод модификации fixInNamespace, когда я набираю quantmod:::chartSeries.chob, то вижу, что environment: namespace:quantmod добавлен в конец определения функции.

4b9b3361

Ответ 1

Так как fixInNamespace вызывает assignInNamespace, вы должны иметь возможность заставить его работать, проблема, вероятно, в том, что среда не является тем же самым и, возможно, некоторыми другими атрибутами. Если вы измените их для соответствия, я бы ожидал, что он будет работать лучше, возможно, используя код, например:

tmpfun <- get("chartSeries.chob", envir = asNamespace("quantmod"))
environment(chartSeries.chob2) <- environment(tmpfun)
attributes(chartSeries.chob2) <- attributes(tmpfun)  # don't know if this is really needed
assignInNamespace("chartSeries.chob", chartseries.chob2, ns="quantmod")

Другим вариантом для некоторых изменений будет использование функции trace. Это приведет к временным изменениям и будет отлично подходит для ввода кода, но я не знаю, было бы разумно удалить команды или изменить их на месте (указание редактора, который изменил код, а не позволял вам его изменить, может сделать это возможным).