有没有办法知道R脚本是直接运行还是在另一个脚本中运行?

时间:2012-06-02 17:55:23

标签: r

我正在使用R studio。

有没有办法知道R脚本是由控制台中的source命令直接运行还是在另一个脚本中运行。即。另一个脚本来源,这可以调用第一个脚本。

在某些情况下,这对于提示某些值非常有用。

我现在正在做的是将变量设置为true或false,并在脚本中检查该变量。这有效,但自动方式更好。

感谢您的时间。

编辑:更多信息

假设我有一个运行良好的独立脚本,但是这个脚本是另一个脚本完成后运行的进程的一部分。如果我必须同时运行,我可以运行第一个,然后运行第二个;但我也有机会跑第二个。

我要问的是,是否有办法(在第二个脚本中)验证第二个是从第一个调用还是从第二个调用。

看看他的简单例子(灵感来自Greg Snow的回答)。首先是我在Rstudio中调用的文件

# scripta.R
writeLines("script A")
if (interactive()) writeLines("interactive: true") else writeLines("interactive false")
source("scriptb.r")
writelines("after B")

然后来源文件

# scriptb.R
writeLines("script B")
if (interactive()) writeLines("interactive: true") else writeLines("interactive false")
writeLines("end B")

Rstudio的结果是

script A
interactive: true
script B
interactive: true
end B
after B

我喜欢像

这样的东西
script A
interactive: true
script B
interactive: false
end B
after B

我希望现在更清楚。

由于

3 个答案:

答案 0 :(得分:5)

不能直接回答您的问题,但相关问题是查看interactive函数。如果R认为您处于交互式会话中并且假设某人可以回答问题是合理的,则此函数将返回TRUE,如果在BATCH模式下运行且它是公平的,它将返回FALSE确定没有人(或外星人,聪明的动物等)来回答问题。

不完全是您的要求,但决定是否提示信息可能会有所帮助。

答案 1 :(得分:1)

如果我理解正确,一个简单的message()命令应该做(我认为)你需要的。由于您基于逻辑检查调用了多个脚本之一,因此在每个脚本的开头回显一条消息,如:

message("R has now entered script_1.R \n")

应该这样做。如果因为某个变量设置为FALSE而从未调用过脚本,那么您将永远不会看到此消息。

如果您需要提示并从控制台读取值,则插入如下行:

new_input <- readline("Enter a value for x: ")

对您也有用。

答案 2 :(得分:0)

这可以做到。首先运行脚本

# script-A.R
cat("script A\n")
if (interactive()) 
  cat("interactive: true\n") else cat("interactive: false\n")

source_func <- function(file){
  # check that the variable does not exist already
  pa <- .GlobalEnv
  has_old <- if(exists("is_sourced", where = pa))
    stop(sQuote("is_sourced"), " exists already")
  pa$is_sourced <- TRUE
  # make sure to remove the variable again
  on.exit(rm(is_sourced, envir = pa)) 
  source(
    file, 
    # .GlobalEnv is used anyway but now it is easy to change to another environment
    local = pa) 

  invisible()
}

source_func("script-B.R")
cat("after B\n")

然后获取源脚本

# script-B.R
if(!exists("is_sourced"))
  if(!interactive())
    # throw an error if interactive and `is_sourced` is not set
    is_sourced <- FALSE else stop("Set ", sQuote("is_sourced"))

if (interactive() && !is_sourced) 
  cat("interactive: true\n") else cat("interactive: false\n")
cat("end B\n")

运行script-A.R的结果是

script A
interactive: true
script B
interactive: false
end B
after B