Rscript против источника: Каковы основные различия? - PullRequest
15 голосов
/ 16 октября 2011

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

Ответы [ 3 ]

15 голосов
/ 16 октября 2011

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

  • source("foo.R") говорит вашему текущему R процессу взять его входные данные от "foo.R".

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

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

3 голосов
/ 16 октября 2011

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

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

2 голосов
/ 17 октября 2011

Как ответ на комментарий @ 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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...