আমি কীভাবে কোনও আর স্ক্রিপ্ট থেকে কমান্ড লাইন প্যারামিটারগুলি পড়তে পারি?


281

আমি একটি আর স্ক্রিপ্ট পেয়েছি যার জন্য আমি বেশ কয়েকটি কমান্ড-লাইন প্যারামিটার সরবরাহ করতে সক্ষম হতে চাই (কোডের মধ্যে হার্ডকোড প্যারামিটার মানগুলির চেয়ে)। স্ক্রিপ্টটি উইন্ডোজে চলে।

আমার আর স্ক্রিপ্টে কমান্ড-লাইনে সরবরাহিত প্যারামিটারগুলি কীভাবে পড়তে হয় সে সম্পর্কে আমি তথ্য খুঁজে পাচ্ছি না। এটি করা না পারলে আমি অবাক হব, তাই আমি কেবল আমার গুগল অনুসন্ধানে সেরা কীওয়ার্ড ব্যবহার করছি না ...

কোন পয়েন্টার বা সুপারিশ?


আপনাকে কার্য সম্পাদনযোগ্য আরএসক্রিপ্টের অবস্থান নির্ধারণ করতে হবে

উত্তর:


209

এখানে আপনার প্রয়োজনীয় সমস্ত কিছুই ডার্কের উত্তর answer এখানে একটি ন্যূনতম পুনরুত্পাদনযোগ্য উদাহরণ।

আমি দুটি ফাইল তৈরি করেছি: exmpl.batএবং exmpl.R

  • exmpl.bat:

    set R_Script="C:\Program Files\R-3.0.2\bin\RScript.exe"
    %R_Script% exmpl.R 2010-01-28 example 100 > exmpl.batch 2>&1

    বিকল্পভাবে, ব্যবহার করে Rterm.exe:

    set R_TERM="C:\Program Files\R-3.0.2\bin\i386\Rterm.exe"
    %R_TERM% --no-restore --no-save --args 2010-01-28 example 100 < exmpl.R > exmpl.batch 2>&1
  • exmpl.R:

    options(echo=TRUE) # if you want see commands in output file
    args <- commandArgs(trailingOnly = TRUE)
    print(args)
    # trailingOnly=TRUE means that only your arguments are returned, check:
    # print(commandArgs(trailingOnly=FALSE))
    
    start_date <- as.Date(args[1])
    name <- args[2]
    n <- as.integer(args[3])
    rm(args)
    
    # Some computations:
    x <- rnorm(n)
    png(paste(name,".png",sep=""))
    plot(start_date+(1L:n), x)
    dev.off()
    
    summary(x)

উভয় ফাইল একই ডিরেক্টরিতে সংরক্ষণ করুন এবং শুরু করুন exmpl.bat। ফলস্বরূপ আপনি পাবেন:

  • example.png কিছু চক্রান্ত সঙ্গে
  • exmpl.batch যা কিছু হয়েছিল তার সাথে

আপনি পরিবেশের পরিবর্তনশীল যুক্ত করতে পারেন %R_Script%:

"C:\Program Files\R-3.0.2\bin\RScript.exe"

এবং এটি আপনার ব্যাচের স্ক্রিপ্টগুলিতে ব্যবহার করুন %R_Script% <filename.r> <arguments>

RScriptএবং এর মধ্যে পার্থক্য Rterm:

  • Rscript আরও সহজ বাক্য গঠন আছে
  • Rscriptx64 এ স্বয়ংক্রিয়ভাবে আর্কিটেকচার চয়ন করে ( বিশদ বিবরণের জন্য আর ইনস্টলেশন ও প্রশাসন, 2.6 উপ-আর্কিটেকচার দেখুন)
  • Rscriptপ্রয়োজন options(echo=TRUE).R ফাইলে যদি আপনি আউটপুট ফাইল আদেশগুলি লিখতে চান

127

কয়েকটি বিষয়:

  1. কমান্ড-লাইন প্যারামিটারগুলির মাধ্যমে অ্যাক্সেসযোগ্য commandArgs(), সুতরাং help(commandArgs)একটি সংক্ষিপ্তসার জন্য দেখুন ।

  2. আপনি Rscript.exeউইন্ডোজ সহ সমস্ত প্ল্যাটফর্মে ব্যবহার করতে পারেন । এটা সমর্থন করবে commandArgs()লিটার উইন্ডোজে পোর্ট করা যেতে পারে তবে এখনই কেবল ওএস এক্স এবং লিনাক্সে বাস করে on

  3. আছে দুই অ্যাড-অন Cran প্যাকেজগুলিতে - getopt এবং optparse - যা উভয় কম্যান্ড-লাইন পার্সিং জন্য লিখিত হয়।

নভেম্বরে 2015 সম্পাদনা করুন: নতুন বিকল্প হাজির হয়েছে এবং আমি আন্তরিকভাবে ডকপ্টের পরামর্শ দিচ্ছি


2
এবং সেখানে আরগ্পারস রয়েছে
gkcn

92

এটি আপনার স্ক্রিপ্টের শীর্ষে যুক্ত করুন:

args<-commandArgs(TRUE)

তারপর আপনি আর্গুমেন্ট হিসাবে পাস পাঠাতে পারেন args[1], args[2]ইত্যাদি

তারপরে দৌড়াও

Rscript myscript.R arg1 arg2 arg3

আপনার আরগগুলি যদি ফাঁকা ফাঁকে ফাঁকে থাকে তবে ডাবল উদ্ধৃতিতে ঘিরে রাখুন।


7
এটি কেবল তখনই কাজ করেছিল যখন আমি <-commandArgs (সত্য) টি ব্যবহার করুন (বড় হাতের এটিকে নোট করুন)।
অ্যান্ডি পশ্চিম

আরজি 1 এর আগে আপনার কি --args দরকার?
ফিলাকলবর্ন

@ ফিলাকলবর্ন নং
ক্রিস_রেন্ডস

15

আপনি যদি জিনিসগুলি আরও সুন্দর হতে চান তবে লাইব্রেরি (getopt) চেষ্টা করুন। উদাহরণ স্বরূপ:

spec <- matrix(c(
        'in'     , 'i', 1, "character", "file from fastq-stats -x (required)",
        'gc'     , 'g', 1, "character", "input gc content file (optional)",
        'out'    , 'o', 1, "character", "output filename (optional)",
        'help'   , 'h', 0, "logical",   "this help"
),ncol=5,byrow=T)

opt = getopt(spec);

if (!is.null(opt$help) || is.null(opt$in)) {
    cat(paste(getopt(spec, usage=T),"\n"));
    q();
}

11

আপনার লিটার দরকার (উচ্চারণ 'ছোট্ট আর')

ডার্ক প্রায় 15 মিনিটের মধ্যে বিস্তৃত হতে হবে;)


11

যেহেতু optparseউত্তরে কয়েকবার উল্লেখ করা হয়েছে, এবং এটি কমান্ড লাইন প্রসেসিংয়ের জন্য একটি বিস্তৃত কিট সরবরাহ করে, আপনি কীভাবে এটি ব্যবহার করতে পারেন তার একটি সংক্ষিপ্ত সরল উদাহরণ এখানে ইনপুট ফাইলটি ধরে নিয়েই ধরে নেওয়া হয়েছে:

script.R:

library(optparse)

option_list <- list(
  make_option(c("-n", "--count_lines"), action="store_true", default=FALSE,
    help="Count the line numbers [default]"),
  make_option(c("-f", "--factor"), type="integer", default=3,
    help="Multiply output by this number [default %default]")
)

parser <- OptionParser(usage="%prog [options] file", option_list=option_list)

args <- parse_args(parser, positional_arguments = 1)
opt <- args$options
file <- args$args

if(opt$count_lines) {
  print(paste(length(readLines(file)) * opt$factor))
}

blah.txt23 লাইন সহ একটি স্বেচ্ছাসেবী ফাইল দেওয়া হয়েছে ।

কমান্ড লাইনে:

Rscript script.R -h আউটপুট

Usage: script.R [options] file


Options:
        -n, --count_lines
                Count the line numbers [default]

        -f FACTOR, --factor=FACTOR
                Multiply output by this number [default 3]

        -h, --help
                Show this help message and exit

Rscript script.R -n blah.txt আউটপুট [1] "69"

Rscript script.R -n -f 5 blah.txt আউটপুট [1] "115"


7

ব্যাশে আপনি নিম্নলিখিত কমান্ড লাইনটি তৈরি করতে পারেন:

$ z=10
$ echo $z
10
$ Rscript -e "args<-commandArgs(TRUE);x=args[1]:args[2];x;mean(x);sd(x)" 1 $z
 [1]  1  2  3  4  5  6  7  8  9 10
[1] 5.5
[1] 3.027650
$

আপনি দেখতে পারেন যে ভেরিয়েবলটি $z"10" দিয়ে ব্যাশ শেল দ্বারা প্রতিস্থাপিত হয় এবং এই মানটি বাছাই করা হয় commandArgsএবং খাওয়ানো হয় args[2], এবং x=1:10আর দ্বারা সফলভাবে নির্ধারিত পরিসীমা কমান্ড ইত্যাদি ইত্যাদি etc.


4

এফওয়াইআই: একটি ফাংশন আরগস রয়েছে (), যা আর ফাংশনগুলির আর্গুমেন্টগুলি পুনরুদ্ধার করে, আর্গুমেন্ট নামের আর্গুমেন্টের ভেক্টরের সাথে বিভ্রান্ত না হওয়ার জন্য


1
এটি প্রায় অবশ্যই ঘটনা নয়। শুধুমাত্র ফাংশন ফাংশনগুলি মাস্ক করতে পারে। ফাংশন হিসাবে একই নামের সাথে একটি ভেরিয়েবল তৈরি করা ফাংশনটি মাস্ক করে না। এই প্রশ্ন এবং উত্তরগুলি দেখুন: stackoverflow.com/q/6135868/602276
অ্যান্ড্রি

সত্য, এটি মুখোশ দেয় না। সাধারণভাবে, আমি আর এর মধ্যে ইতিমধ্যে বিদ্যমান নামের সাথে ফাংশন এবং ভেরিয়েবলের নামকরণ এড়াতে চেষ্টা করি
টিম

1

আপনি যদি পতাকা সহ বিকল্পগুলি নির্দিষ্ট করতে চান, (যেমন -h, --help, --number = 42, ইত্যাদি) আপনি আর প্যাকেজ অপ্টপার্স (পাইথন থেকে অনুপ্রাণিত) ব্যবহার করতে পারেন: http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf

কমপক্ষে এটি আমি কীভাবে আপনার প্রশ্নটি বুঝতে পারি, কারণ ব্যাশ গোটোপ্ট, বা পার্ল গেটোপট, বা পাইথন আরগপারস এবং অপ্টপার্সের সমতুল্য সন্ধান করার সময় আমি এই পোস্টটি পেয়েছি।


1

এই স্যুইচিং আচরণটি উত্পন্ন করতে আমি কেবল একটি দুর্দান্ত ডেটা কাঠামো এবং প্রসেসিংয়ের চেইন একসাথে রেখেছি, কোনও লাইব্রেরির প্রয়োজন নেই। আমি নিশ্চিত যে এটি বহুবার প্রয়োগ করা হবে এবং উদাহরণটি সন্ধান করতে এই থ্রেডটি জুড়ে এসেছিল - ভেবেছিলাম আমি চিপ করব।

আমার এমনকি বিশেষত পতাকাগুলির প্রয়োজন হয়নি (এখানে কেবলমাত্র পতাকাটি একটি ডিবাগ মোড, এটি একটি ভেরিয়েবল তৈরি করে যা আমি ডাউন স্ট্রিম ফাংশন শুরু করার শর্ত হিসাবে if (!exists(debug.mode)) {...} else {print(variables)})যাচাই করি lapplybelow নীচের পতাকা চেকিং স্টেটমেন্টগুলি একইভাবে উত্পন্ন করে:

if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args) 

argsকমান্ড লাইন আর্গুমেন্টগুলি থেকে ভেরিয়েবলটি কোথায় পড়বে (একটি অক্ষর ভেক্টর, c('--debug','--help')উদাহরণস্বরূপ আপনি এগুলি সরবরাহ করার সাথে সমান )

এটি অন্য কোনও পতাকাটির জন্য পুনরায় ব্যবহারযোগ্য এবং আপনি সমস্ত পুনরাবৃত্তি এড়ানো এবং কোনও লাইব্রেরি যাতে কোনও নির্ভরতা নেই:

args <- commandArgs(TRUE)

flag.details <- list(
"debug" = list(
  def = "Print variables rather than executing function XYZ...",
  flag = "--debug",
  output = "debug.mode <- T"),
"help" = list(
  def = "Display flag definitions",
  flag = c("-h","--help"),
  output = "cat(help.prompt)") )

flag.conditions <- lapply(flag.details, function(x) {
  paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
  if (eval(parse(text = x))) {
    return(T)
  } else return(F)
}))

help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
  paste0(c(paste0(flag.details[x][[1]][['flag']], collapse="  "),
  flag.details[x][[1]][['def']]), collapse="\t")
} )

help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")

# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
  if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))

মনে রাখবেন যে flag.detailsকমান্ডগুলি স্ট্রিং হিসাবে সংরক্ষণ করা হয়, তারপরে মূল্যায়ন করা হবে eval(parse(text = '...'))। Optparse কোনও গুরুতর স্ক্রিপ্টের জন্য স্পষ্টতই কাম্য, তবে ন্যূনতম-কার্যকারিতা কোড কখনও কখনও খুব ভাল।

নমুনা আউটপুট:

$ রেক্রিপ্ট চেক_মেল.আরস্ক্রিপ্ট - সহায়তা
--debug XYZ ফাংশন সম্পাদন করার পরিবর্তে প্রিন্ট ভেরিয়েবল ...

-h - সাহায্য প্রদর্শন পতাকা সংজ্ঞা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.