Как правильно `сохранить` функцию, которая использует переменные из глобального пространства имен? - PullRequest
1 голос
/ 20 октября 2019
  • У меня есть два инструмента A, B, которые «отключены» друг от друга с некоторой систематической ошибкой. Например, A последовательно читает +5 от B.
  • Итак, мне нужна функция A_to_B, которая отображает показания от A до B, например, A = B + 5
  • Я написал эту функцию всценарий, использующий линейную модель A против B.
  • Но я использую эти инструменты повсюду, поэтому мне понадобится это в других сценариях.
  • Итак, я пытаюсь save функция.
AB.readings <- read.csv('AB.csv')
AvB.lm <- lm(A~B+I(B^2), data=AB.readings)
A_to_B <- function(a) {
    coeff <- AvB.lm$coefficients - c(a, 0, 0)
    roots <- Re(polyroot(coeff))
    return(roots[roots>=0])  # A, B readings > 0
}
save(AvB.lm, A_to_B, file='calibration.RData')

Но, когда я пытаюсь загрузить и использовать эту функцию в других скриптах:

source('calibration.RData')
AB.readings <- read.csv('AB2.csv')
AB.readings$A <- A_to_B(AB.readings$A)

Я получаю ошибку:

Error in A_to_B(AB.readings$A) : object 'AvB.lm' not found
Execution halted

Так что, очевидно, я сделал что-то не так с областью видимости.


Какой правильный способ сделать это в R?

1 Ответ

0 голосов
/ 20 октября 2019

Вы должны использовать load, а не source. Из документов:

save записывает внешнее представление объектов R в указанный файл. Объекты могут быть позже считаны из файла с помощью функции load или attach (или data в некоторых случаях).

Примечание: комментарий RAB выше ( Rdata для данных, а не для функции. ) неверно, и save также сохранит функции. Напомним, что все в R является объектом , включая функции. save записывает внешние представления R-объектов, поэтому из этого следует, что save также будет записывать внешние представления функций.

...