是否可以在RStudio中为R脚本指定命令行参数?

时间:2013-02-20 12:52:22

标签: r rstudio

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

my_rscript --dataset mydataset

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

但是,我无法在RStudio中找到可以提供acommand行的位置,因此我可以使用“Source on save”功能。相反,我必须对程序本身中的所有程序参数进行硬编码:

dataset <- "mydataset"

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

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

7 个答案:

答案 0 :(得分:16)

现在我这样做: 打开一个编辑新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

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

您可以使用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

答案 3 :(得分:1)

这对我有用: 我的Rscript如下:

commandArgs <- function() c("AMZN", 10, 200)

要模拟命令行输入,我将使用Rscript,我在RStudio中输入:

[1] "args:AMZN" "args:10" "args:200" [1] "args[1]:AMZN" [1] "args[2]:10" [1] "args[3]:200" [1] "# of args:3"

给出了期望的结果:

function renderer(info)
{
    let {props, error, element} = info;
    if (error) {
        return (<ServerError errors={error}/>);
    } else {
        if (props) {
            return React.cloneElement(element, props);
        } else {
            return (<Loading />);
        }
    }
}


ReactDOM.render(
    <Router
        history={browserHistory}
        render={applyRouterMiddleware(useRelay)}
        environment={Relay.Store}
    >
        <Route
            path="/"
            queries={ViewerQuery}
            component={App}
        >
            <IndexRoute
                queries={ViewerQuery}
                component={Libraries}
                render={renderer}
            />
        <Route path="*" component={Error}/>

    </Route>
</Router>

答案 4 :(得分:1)

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

  1. my_rscript中编写命令行解析器,并创建一个包含所有已解析输入的对象args
  2. 添加一行将args对象保存到文件。
  3. 从命令行运行my_rscript并指定感兴趣的参数。
  4. 从Rstudio中的文件加载args对象并以交互方式继续
  5. 示例:

    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
    

答案 5 :(得分:0)

这真的很老了,但是当我尝试做同样的事情时我偶然发现它并且我最终只是尝试了以下内容,并且如果人们想要尝试它会很好很快(可能只对命令有用)虽然有几个简单的args:

鉴于我目前开始的Rscript:

args <- commandArgs(TRUE)
df <- read.csv(args[1], sep=",", check.names=FALSE, row.names = 1)
.
. # Do some analysis and plotting etc.
.

如果我想模仿Rscript本来会收到的命令行,可以手动设置args向量&#39;:

args <- c("/path/to/my/inputfile.csv")

然后args[1]具有与其始终相同的值。我只需在RStudio中突出显示并执行,就可以在脚本中运行其他所有内容。

答案 6 :(得分:0)

虽然此行为仍未内置到 Rstudio 中,但您可以通过多种方式完成某些事情,以帮助您实现您正在寻找的工作流程。

1.互动提示

readlinemenu 函数允许您通过向终端添加提示并接受输入作为响应来使脚本具有交互性。因此,如果您不想每次在 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))