目标是有两种简单的方法来源代码,比如func.R,包含一个函数。调用R CMD BATCH func.R
初始化函数并进行求值。在会话中,发出source("func.R")
只是初始化函数。
有什么想法吗?
答案 0 :(得分:42)
我认为interactive()
功能可能有用。
当交互使用R时,此函数返回TRUE
,否则返回FALSE
。所以只需使用if (interactive())
即。相当于
if (!interactive()) {
main()
}
答案 1 :(得分:9)
另一种选择是:
#!/usr/bin/Rscript
# runs only when script is run by itself
if (sys.nframe() == 0){
# ... do main stuff
}
答案 2 :(得分:5)
您可以将参数传递给R,如果存在参数,则运行main()。更多关于这里的论点:http://yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/
答案 3 :(得分:2)
这是很多工作,但我终于得到了它(并发布在Rosetta Code)。
此示例导出名为meaningOfLife
的函数。当脚本自行运行时,它会运行main
。当由另一个R文件导入时,它不会运行main
。
#!/usr/bin/Rscript
meaningOfLife <- function() {
42
}
main <- function(program, args) {
cat("Main: The meaning of life is", meaningOfLife(), "\n")
}
getProgram <- function(args) {
sub("--file=", "", args[grep("--file=", args)])
}
args <- commandArgs(trailingOnly = FALSE)
program <- getProgram(args)
if (length(program) > 0 && length(grep("scriptedmain", program)) > 0) {
main(program, args)
q("no")
}
答案 4 :(得分:2)
我在主脚本中使用getOption('run.main', default=TRUE)
问了一个类似的问题,in an answer, Matthew Plourde suggested,然后在调用options(run.main=FALSE)
之前设置source()
。这适用于我的情况。
当你有一个R脚本创建一堆函数并且你想在脚本末尾写几行来试验函数的使用时,一个更简单的模式:将这些额外的行放在{{1阻止。
答案 5 :(得分:0)
这对我来说效果很好。如果您有两个文件,并且想在只运行文件的某一部分时将一个文件与另一个文件一起使用。
父文件:parent.R
print("Running Parent File")
`__name__` <- "__main__"
print(paste0("This file is : ", `__name__`))
`__src__` <- "__not.main__"
source("child.R")
rm(`__src__`)
子文件:child.R
print("Running Child File")
`__name__` <- "__main__"
if (exists("__src__")){`__name__` <- `__src__`}
if (`__name__` == "__main__"){
print(paste0("This file is : ", `__name__`))
} else {
print(paste0("This file is : ", `__name__`))
}
运行 Rscript parent.R 时的输出
[1] "Running Parent File"
[1] "This file is : __main__"
[1] "Running Child File"
[1] "This file is : __not.main__"
运行 Rscript child.R 时的输出
[1] "Running Child File"
[1] "This file is : __main__"
更强大的方法是编写一个自定义源函数,其中可以包含参数列表。
source2 <- function(file, args = list()){
tryCatch(
expr = {
assign("__src__", "__not.main__", envir = globalenv())
assign("__src.args__", args, envir = globalenv())
source(file)
},
error = function(e){
message("File could not be sourced")
},
finally = {
rm(list = c("__src__", "__src.args__"), envir = globalenv());
assign("__name__", "__main__", envir = globalenv())
})
}
source2("child.R", args = list("list", "of", "arguments"))