我想使用RStudio编辑具有命令行参数的R脚本,例如,
my_rscript --dataset mydataset
然后将optiion值读入R变量,例如dataset
,例如,使用optparse
库。
但是,我无法在RStudio中找到可以提供acommand行的位置,因此我可以使用“Source on save”功能。相反,我必须对程序本身中的所有程序参数进行硬编码:
dataset <- "mydataset"
每次我需要指定不同的数据时都需要修改脚本文本。
有人知道如何提供命令行信息吗?
答案 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日)。
答案 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进行交互式开发/分析,您可以使用以下解决方法:
my_rscript
中编写命令行解析器,并创建一个包含所有已解析输入的对象args
。args
对象保存到文件。 my_rscript
并指定感兴趣的参数。 args
对象并以交互方式继续示例:
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 中,但您可以通过多种方式完成某些事情,以帮助您实现您正在寻找的工作流程。
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))