我想使用 RStudio 编辑具有命令行参数的 R 脚本,例如,
my_rscript --dataset mydataset
然后将选项值读入 R 变量,dataset
例如,使用optparse
库。
但是,我找不到可以在 RStudio 中提供命令行的位置,以便我可以使用“保存时源”功能。相反,我必须在程序本身中硬编码所有程序参数:
dataset <- "mydataset"
每次我需要指定不同的数据时,都需要修改脚本文本。
有人知道如何提供命令行信息吗?
现在我这样做:打开一个编辑新 Rscript 的新窗口。如果我想保留它,我可以保存并将其命名为:test_myscript.R
这是以下内容test_myscript.R
:
debug(getopt) # suppose I want to debug 'getopt' function in 'myscript.R'
system("myscript.R -a -b -c")
# Debug process start after this.
# Check ?browser for help about navigating inside browser
我知道这个问题很旧,下面的链接也很旧,但它回答了这个问题。不,从 RStudio 访问命令行参数是不可能的(或者截至 2012 年 1 月 29 日还没有)。
您可以使用Rscript programname.r arg1 arg2 arg3
. 参数被传递给commandArgs
,因此以下情况为真:
Rscript programname.r F N 32
> args <- commandArgs(trailingOnly=TRUE)
> args[1]
[1] F
> args[2]
[1] N
> args[3]
[1] 32
这对我有用:我的 Rscript 如下:
args <- commandArgs()
print(paste0("args:", args))
print(paste0("args[1]:",args[1]))
print(paste0("args[2]:",args[2]))
print(paste0("args[3]:",args[3]))
print(paste0("# of args:",length(args)))
'
为了模拟我将在 Rscript 中使用的命令行输入,我在 RStudio 中输入了这个:
commandArgs <- function() c("AMZN", 10, 200)
这给出了预期的结果:
[1] "args:AMZN" "args:10" "args:200"
[1] "args[1]:AMZN"
[1] "args[2]:10"
[1] "args[3]:200"
[1] "# of args:3"
如果您有兴趣使用例如 argparser 并继续使用 Rstudio 进行交互式开发/分析,您可以使用以下解决方法:
my_rscript
并创建一个args
包含所有已解析输入的对象。args
对象保存到文件的行。my_rscript
从命令行运行并指定感兴趣的参数。args
从 Rstudio 中的文件加载对象并以交互方式继续例子:
library("argparser")
parser <- arg_parser(description='Process commandline arguments')
parser <- add_argument(parser, arg="--dataset", type="character", help = "Dataset argument")
args = parse_args(parser)
args_file = "tempArgObjectFile.rds"
saveRDS(args, args_file); print(args); quit(); #comment this after creating args_file
args = readRDS(args_file) #use this to load during interactive development
虽然这种行为仍然没有内置到 Rstudio 中,但有几种方法可以帮助您实现所需的工作流程。
readline
和函数允许您通过menu
在终端中添加提示并接受输入作为响应来使您的脚本具有交互性。因此,如果您主要关心的不是每次在 Rstudio 中运行时都修改脚本,您可以设置一系列这些命令来每次输入参数,如下所示:
x <- readline("What is your quest? ")
y <- menu(title = "What is your favorite color?", choices = c("Blue", "Clear"))
print(paste("Your quest is", x))
if (y == 1) print("Aaaaaargh!")
一个相关的问题是希望能够在 Rstudio 中工作时更改脚本的参数,但不会阻止脚本在命令行上使用。这是脚本中硬编码参数的问题。虽然替换或覆盖commandArgs
可以更轻松地在一个地方提供所有参数,当需要使用完成的代码时可以将其注释掉,但这仍然不能解决问题。相反,请考虑检测您是否处于交互模式并相应地处理参数:
if (interactive()) {
opts <- c('grail')
} else {
opts <- commandArgs(trailingOnly = TRUE)
}
print(paste("I seek the", opts[1]))
如果您使用 optparse,它会变得更加容易。只需将default
每次调用中的参数设置为make_option
,这将是您以交互方式运行程序时使用的参数。这也可以与上述任一工作流程结合使用。
library(optparse)
opt_list <- list(make_option(
c("--quest"),
dest = 'your_quest',
type = 'character',
default = "the grail"
))
opt_parser <- OptionParser(option_list = opt_list)
opt <- parse_args(opt_parser)
print(paste("You seek", opt$your_quest))
这真的很老了,但是我在尝试做同样的事情时偶然发现了它,我最终只是尝试了以下方法,如果人们想尝试它,它又好又快(可能只对有几个简单的命令有用参数虽然):
鉴于我当前启动的 Rscript:
args <- commandArgs(TRUE)
df <- read.csv(args[1], sep=",", check.names=FALSE, row.names = 1)
.
. # Do some analysis and plotting etc.
.
如果我想模拟 Rscript 否则会收到的命令行,您可以args
“手动”创建向量:
args <- c("/path/to/my/inputfile.csv")
然后args[1]
具有它始终具有的相同值。我只是通过在 RStudio 中突出显示和执行来运行脚本中的所有其他内容。