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

Rscript против источника: каковы основные отличия?

Это может быть очень простой вопрос, но пока не нашел убедительного ответа. При выполнении R script внутри среды R я могу либо сделать source(foo.R), либо system("Rscript foo.R"). Есть ли какая-либо разница между этими двумя подходами, и если да, то как эти два подхода сравниваются?

4b9b3361

Ответ 1

Они принципиально отличаются по своим эффектам.

  • source("foo.R") сообщает вашему процессу current R, чтобы он ввел его из "foo.R".

  • system("Rscript foo.R") использует команду операционной системы для запуска процесса отдельного R, в котором оценивается содержимое "foo.R".

Вызов Rscript не будет напрямую влиять на ваш текущий сеанс R, за исключением того, что он по умолчанию будет распечатывать вывод этого другого сеанса R на вашей текущей консоли. (Вы можете отключить это при вызове system(), установив show.output.on.console=FALSE).

Ответ 2

Я думаю, что source(foo.R) включает исходный код этого файла (foo.R) в вашу текущую среду. Если вы определяете переменную в foo.R, скажем x <- 5, и в вашем текущем проекте вы заранее определяете x <- 6, x становится 5.

system("Rscript foo.R") запускает программу Rscript с аргументом foo.R, поэтому ваша текущая среда вообще не изменяется.

Ответ 3

Как ответ на комментарий @Ramnath: sys.source("foo") не совпадает с Rscript foo. Например, вы можете сделать следующее с помощью sys.source:

e <- new.env()
sys.source("foo", e)  # foo creates a bunch of objects in environment e
z <- with(e, {
    # do stuff with e....
})
rm(e)

Вы можете сделать это, если вы создаете несколько промежуточных объектов, которые затем выполняете и возвращаете окончательный результат. Вы не хотите сохранять промежуточные объекты, поэтому их размещение в их собственной временной среде - простой способ удалить их за один раз.