16

我想使用 RStudio 编辑具有命令行参数的 R 脚本,例如,

my_rscript --dataset mydataset

然后将选项值读入 R 变量,dataset例如,使用optparse库。

但是,我找不到可以在 RStudio 中提供命令行的位置,以便我可以使用“保存时源”功能。相反,我必须在程序本身中硬编码所有程序参数:

dataset <- "mydataset"

每次我需要指定不同的数据时,都需要修改脚本文本。

有人知道如何提供命令行信息吗?

4

7 回答 7

17

现在我这样做:打开一个编辑新 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
于 2014-08-05T21:19:56.360 回答
8

我知道这个问题很旧,下面的链接也很旧,但它回答了这个问题。不,从 RStudio 访问命令行参数是不可能的(或者截至 2012 年 1 月 29 日还没有)。

链接 https://support.rstudio.com/hc/communities/public/questions/200659066-Accessing-command-line-options-in-RStudio?locale=en-us

于 2013-12-02T21:06:52.270 回答
6

您可以使用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
于 2013-02-26T15:13:37.667 回答
2

这对我有用:我的 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"
于 2016-10-12T16:53:56.240 回答
2

如果您有兴趣使用例如 argparser 并继续使用 Rstudio 进行交互式开发/分析,您可以使用以下解决方法:

  1. 编写命令行解析器my_rscript并创建一个args包含所有已解析输入的对象。
  2. 添加将args对象保存到文件的行。
  3. my_rscript从命令行运行并指定感兴趣的参数。
  4. 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
于 2018-02-20T08:41:33.843 回答
0

虽然这种行为仍然没有内置到 Rstudio 中,但有几种方法可以帮助您实现所需的工作流程。

1. 互动提示

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!")

2.检测交互模式

一个相关的问题是希望能够在 Rstudio 中工作时更改脚本的参数,但不会阻止脚本在命令行上使用。这是脚本中硬编码参数的问题。虽然替换或覆盖commandArgs可以更轻松地在一个地方提供所有参数,当需要使用完成的代码时可以将其注释掉,但这仍然不能解决问题。相反,请考虑检测您是否处于交互模式并相应地处理参数:

if (interactive()) {
  opts <- c('grail')
} else {
  opts <- commandArgs(trailingOnly = TRUE)
}

print(paste("I seek the", opts[1]))

3. 使用 optparse 的默认值

如果您使用 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))
于 2021-04-27T16:09:44.430 回答
0

这真的很老了,但是我在尝试做同样的事情时偶然发现了它,我最终只是尝试了以下方法,如果人们想尝试它,它又好又快(可能只对有几个简单的命令有用参数虽然):

鉴于我当前启动的 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 中突出显示和执行来运行脚本中的所有其他内容。

于 2016-08-31T11:35:32.993 回答