这可能是一个非常基本的问题,但尚未找到令人信服的答案。在R环境中执行R脚本时,我可以source(foo.R)
或system("Rscript foo.R")
。两种方法之间是否存在任何差异,如果是这样,两种方法的比较如何?
答案 0 :(得分:15)
它们的效果根本不同。
source("foo.R")
告诉您的当前 R进程从"foo.R"
获取其输入。
system("Rscript foo.R")
使用操作系统命令启动单独的 R进程,在该进程中评估"foo.R"
的内容。
Rscript
调用根本不会直接影响当前的R会话,除之外,它默认会在当前控制台上打印其他R会话的输出。 (您可以通过设置system()
)在show.output.on.console=FALSE
来电中停用此功能。
答案 1 :(得分:3)
我认为source(foo.R)
在当前环境中包含该文件(foo.R
)的源代码。如果您在foo.R
中定义变量,请说x <- 5
,并在当前项目中预先定义x <- 6
,x
变为5
。
system("Rscript foo.R")
使用参数Rscript
运行foo.R
程序,因此您当前的环境根本不会受到影响。
答案 2 :(得分:2)
作为对@ 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)
如果要创建多个中间对象,则可以执行此操作,然后执行操作并返回最终结果。您不希望保留中间对象,因此将它们放入自己的临时环境中是一种简单的方法,可以一次性删除它们。