11

我正在使用 R 工作室。

有没有办法知道 R 脚本是通过控制台中的源命令直接运行还是在另一个脚本中运行。IE。另一个脚本是源代码,它调用了第一个脚本。

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

我现在正在做的是将变量设置为 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

我希望现在更清楚。

谢谢

4

3 回答 3

7

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

不完全是您的要求,但它可能有助于决定是否提示您提供信息。

于 2012-06-02T19:41:38.047 回答
1

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

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

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

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

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

也会对你有用。

于 2012-06-02T19:30:41.467 回答
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
于 2019-01-12T09:43:17.483 回答