我正在使用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
我希望现在更清楚。
由于
答案 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