Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在另一个R文件中的R文件上调用source()时如何传递命令行参数_R - Fatal编程技术网

在另一个R文件中的R文件上调用source()时如何传递命令行参数

在另一个R文件中的R文件上调用source()时如何传递命令行参数,r,R,在一个R文件中,我计划生成另一个支持读取两个命令行参数的R文件。这听起来是一项琐碎的任务,但我无法在网上找到解决方案。非常感谢您的帮助。如果您有一个脚本源于另一个脚本,您可以在第一个脚本中定义可供源脚本使用的变量 > tmpfile <- tempfile() > cat("print(a)", file=tmpfile) > a <- 5 > source(tmpfile) [1] 5 >tmpfile目录(“打印(a)”,文件=tmpfile) >源(t

在一个R文件中,我计划生成另一个支持读取两个命令行参数的R文件。这听起来是一项琐碎的任务,但我无法在网上找到解决方案。非常感谢您的帮助。

如果您有一个脚本源于另一个脚本,您可以在第一个脚本中定义可供源脚本使用的变量

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5
>tmpfile目录(“打印(a)”,文件=tmpfile)
>源(tmpfile)
[1] 5

如果一个脚本源于另一个脚本,则可以在第一个脚本中定义变量,供源脚本使用

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5
>tmpfile目录(“打印(a)”,文件=tmpfile)
>源(tmpfile)
[1] 5

我假设源代码脚本使用
commandArgs
访问命令行参数?如果是这样,您可以覆盖父脚本中的
commandArgs
,以在正在寻找资源的脚本中调用它时返回所需的内容。要了解这将如何工作:

文件\u到\u source.R

main_script.R


commandArgs我假设源代码脚本使用
commandArgs
访问命令行参数?如果是这样,您可以覆盖父脚本中的
commandArgs
,以在正在寻找资源的脚本中调用它时返回所需的内容。要了解这将如何工作:

文件\u到\u source.R

main_script.R


commandArgs最简单的解决方案是将
source()
替换为
system()
paste
。试一试

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))

arg1最简单的解决方案是将
source()
替换为
system()
paste
。试一试

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))

arg1是@Matthew Plourde答案的扩展版本。我通常做的是使用if语句检查命令行参数是否已定义,否则读取它们

此外,我尝试使用argparse库读取命令行参数,因为它提供了更整洁的语法和更好的文档

要获取的文件

 if (!exists("args")) {
         suppressPackageStartupMessages(library("argparse"))
         parser <- ArgumentParser()
         parser$add_argument("-a", "--arg1", type="character", defalt="a",
               help="First parameter [default %(defult)s]")
         parser$add_argument("-b", "--arg2", type="character", defalt="b",
               help="Second parameter [default %(defult)s]")
         args <- parser$parse_args()
 }

 print (args)

c、 d

是@Matthew Plourde答案的扩展版本。我通常做的是使用if语句检查命令行参数是否已定义,否则读取它们

此外,我尝试使用argparse库读取命令行参数,因为它提供了更整洁的语法和更好的文档

要获取的文件

 if (!exists("args")) {
         suppressPackageStartupMessages(library("argparse"))
         parser <- ArgumentParser()
         parser$add_argument("-a", "--arg1", type="character", defalt="a",
               help="First parameter [default %(defult)s]")
         parser$add_argument("-b", "--arg2", type="character", defalt="b",
               help="Second parameter [default %(defult)s]")
         args <- parser$parse_args()
 }

 print (args)
c、 这项工作:

# source another script with arguments
source_with_args <- function(file, ...){
  commandArgs <<- function(trailingOnly){
    list(...)
  }
  source(file)
}

source_with_args("sourcefile.R", "first_argument", "second_argument")
#使用参数生成另一个脚本
source_与_args这起作用:

# source another script with arguments
source_with_args <- function(file, ...){
  commandArgs <<- function(trailingOnly){
    list(...)
  }
  source(file)
}

source_with_args("sourcefile.R", "first_argument", "second_argument")
#使用参数生成另一个脚本


source_和_args Dirk,我已经搜索过了,但在StackOverflow中找不到任何相关的。我看到你回答了很多与R有关的问题。感谢您的贡献。您可以控制读取两个命令行参数的文件吗?您是指来自bash shell还是来自R控制台的命令行参数?为什么要这样做?
source(file)
的原因是将内容加载到您的工作区中。如果要执行源对象,最好在下一个命令中执行。回答GSee和Seth的注释。我编写了R脚本,该脚本在Bash shell.Dirk中使用,我已经搜索过了,但在StackOverflow中找不到任何相关的脚本。我看到你回答了很多与R有关的问题。感谢您的贡献。您可以控制读取两个命令行参数的文件吗?您是指来自bash shell还是来自R控制台的命令行参数?为什么要这样做?
source(file)
的原因是将内容加载到您的工作区中。如果要执行源对象,最好在下一个命令中执行。回答GSee和Seth的注释。我编写了源代码中的R脚本,该脚本在Bash shell中使用。重新定义commandArgs()函数看起来是一个明智的解决方案。我尝试了这个方法,效果很好。@MatthewPlourd我不明白它是如何工作的,我必须将文件路径作为参数传递,而且我只有一个r脚本。您对父脚本和源脚本的意思是什么?@user4050此问题和答案处理从一个r脚本中执行另一个r脚本的情况。如果您正在从命令行运行R脚本,只需使用commandArgs()函数。这可以正常工作,但在从文件到源文件的
commandArgs
调用使用
trailingOnly
参数时失败。为了解决这个问题,我发现这通常更有用:
commandArgs我认为这是一个非常糟糕的解决方案,因为您要做的是重新定义
commandArgs()
函数。重新定义commandArgs()函数看起来是一个聪明的解决方案。我尝试了这个方法,效果很好。@MatthewPlourd我不明白它是如何工作的,我必须将文件路径作为参数传递,而且我只有一个r脚本。您对父脚本和源脚本的意思是什么?@user4050此问题和答案处理从一个r脚本中执行另一个r脚本的情况。如果您正在从命令行运行R脚本,只需使用commandArgs()函数。这可以正常工作,但在从文件到源文件的
commandArgs
调用使用
trailingOnly
参数时失败。为了解决这个问题,我发现这通常更有用:
commandArgs我认为这是一个非常糟糕的解决方案,因为您要做的是重新定义
commandArgs()
函数。您是对的,这很简单,但它不会将
file\u到\u source.R
生成的对象带入
globalenv()
。为此,在我看来,你需要Matthew Plourde的破解——重新定义
commandArgs
,并且可能在调用
source()
后立即重新定义
rm()
你的版本“这些年来,这个接口变得相当复杂:请参阅system2,以获得新代码推荐的更具可移植性和灵活性的接口。”难道不可能定义一个定义所需参数的环境,然后在该环境中为脚本提供源代码,以便找到正确的参数吗?然后