Это может быть очень простой вопрос, но пока не нашел убедительного ответа. При выполнении 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)
Вы можете сделать это, если вы создаете несколько промежуточных объектов, которые затем выполняете и возвращаете окончательный результат. Вы не хотите сохранять промежуточные объекты, поэтому их размещение в их собственной временной среде - простой способ удалить их за один раз.