Я хотел бы иметь возможность изменять скрытую функцию внутри 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
добавлен в конец определения функции.