有没有一种方法可以使用 Rscript.exe 从命令行调试 R 脚本 运行
Is there a way to debug an R script run from the command line with Rscript.exe
是否可以调试使用 Rscript.exe 执行的 R 源文件?
> Rscript.exe mysource.R various parameters
理想情况下,我希望能够在 RStudio 的 mysource.R 文件中的某处设置断点。
是否可以直接在命令行进入 R 调试器,例如通过向源文件添加一些调试指令?
也许从 R 获取文件可行?如何?如何传递命令行参数 "various parameters" 以便 commandArgs() returns 获得正确的值?
mysource.R 可能如下所示(实际上要复杂得多)。
#!/usr/bin/Rscript
args <- commandArgs(trailingOnly=TRUE)
print(args)
就从控制台进行调试而言,很少有相关问题没有答案。
Is there a way to debug an RScript call in RStudio? and Rscript debug using command line
因此,我不确定是否发生了某些变化以及现在是否可行。
但是,我们可以使用 hack 从源文件中进行调试。您可以在文件中要调试的任何位置添加 browser()
。将您的主文件视为:
main.R
args <- commandArgs(trailingOnly=TRUE)
browser()
print(args)
现在,我们可以覆盖 commandArgs
函数并传递我们想要传递的任何参数,这些参数将在您获取文件时传递。
calling_file.R
commandArgs <- function(...) list(7:9, letters[1:3])
source("main.R")
在 运行 source
命令之后,您可以从那里进行调试
Called from: eval(ei, envir)
#Browse[1]> args
#[[1]]
#[1] 7 8 9
#[[2]]
#[1] "a" "b" "c"
没有在命令行中调试 Rscript 的本机方法,但您可以使用我用 readLines
和 eval
.
想出的一种变通方法
ipdb.r <- function(){
input <- ""
while(!input %in% c("c","cont","continue"))
{
cat("ipdb.r>")
# stdin connection to work outside interactive session
input <- readLines("stdin",n=1)
if(!input %in% c("c","cont","continue","exit"))
{
# parent.frame() runs command outside function environment
print(eval(parse(text=input),parent.frame()))
}else if(input=="exit")
{
stop("Exiting from ipdb.r...")
}
}
}
使用 Rscript 调用的 R 文件中的示例用法:
ipdbrtest.R
a <- 3
print(a)
ipdb.r()
print(a)
命令行:
$ Rscript ipdbrtest.R
[1] 3
ipdb.r>a+3
[1] 6
ipdb.r>a+4
[1] 7
ipdb.r>a <- 4
[1] 4
ipdb.r>c
[1] 4
如果您正在考虑使用 R 而不是 Rscript,您可以将环境变量传递给它并使用 Sys.getenv()
检索它们。
是否可以调试使用 Rscript.exe 执行的 R 源文件?
> Rscript.exe mysource.R various parameters
理想情况下,我希望能够在 RStudio 的 mysource.R 文件中的某处设置断点。 是否可以直接在命令行进入 R 调试器,例如通过向源文件添加一些调试指令?
也许从 R 获取文件可行?如何?如何传递命令行参数 "various parameters" 以便 commandArgs() returns 获得正确的值?
mysource.R 可能如下所示(实际上要复杂得多)。
#!/usr/bin/Rscript
args <- commandArgs(trailingOnly=TRUE)
print(args)
就从控制台进行调试而言,很少有相关问题没有答案。
Is there a way to debug an RScript call in RStudio? and Rscript debug using command line
因此,我不确定是否发生了某些变化以及现在是否可行。
但是,我们可以使用 hack 从源文件中进行调试。您可以在文件中要调试的任何位置添加 browser()
。将您的主文件视为:
main.R
args <- commandArgs(trailingOnly=TRUE)
browser()
print(args)
现在,我们可以覆盖 commandArgs
函数并传递我们想要传递的任何参数,这些参数将在您获取文件时传递。
calling_file.R
commandArgs <- function(...) list(7:9, letters[1:3])
source("main.R")
在 运行 source
命令之后,您可以从那里进行调试
Called from: eval(ei, envir)
#Browse[1]> args
#[[1]]
#[1] 7 8 9
#[[2]]
#[1] "a" "b" "c"
没有在命令行中调试 Rscript 的本机方法,但您可以使用我用 readLines
和 eval
.
ipdb.r <- function(){
input <- ""
while(!input %in% c("c","cont","continue"))
{
cat("ipdb.r>")
# stdin connection to work outside interactive session
input <- readLines("stdin",n=1)
if(!input %in% c("c","cont","continue","exit"))
{
# parent.frame() runs command outside function environment
print(eval(parse(text=input),parent.frame()))
}else if(input=="exit")
{
stop("Exiting from ipdb.r...")
}
}
}
使用 Rscript 调用的 R 文件中的示例用法:
ipdbrtest.R
a <- 3
print(a)
ipdb.r()
print(a)
命令行:
$ Rscript ipdbrtest.R
[1] 3
ipdb.r>a+3
[1] 6
ipdb.r>a+4
[1] 7
ipdb.r>a <- 4
[1] 4
ipdb.r>c
[1] 4
如果您正在考虑使用 R 而不是 Rscript,您可以将环境变量传递给它并使用 Sys.getenv()
检索它们。