Это может быть очень простой вопрос, но пока не нашел убедительного ответа. При выполнении R script внутри среды R я могу либо сделать source(foo.R), либо system("Rscript foo.R"). Есть ли какая-либо разница между этими двумя подходами, и если да, то как эти два подхода сравниваются?
Rscript против источника: каковы основные отличия?
Ответ 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)
Вы можете сделать это, если вы создаете несколько промежуточных объектов, которые затем выполняете и возвращаете окончательный результат. Вы не хотите сохранять промежуточные объекты, поэтому их размещение в их собственной временной среде - простой способ удалить их за один раз.