আর সিএমডি ব্যাচে কমান্ড লাইন আর্গুমেন্ট পাস করা


102

আমি R CMD BATCH my_script.Rএকটি টার্মিনাল থেকে একটি Rস্ক্রিপ্ট চালানোর জন্য ব্যবহার করে আসছি । আমি এখন সেই স্থানে আছি যেখানে আমি কমান্ডের সাথে একটি যুক্তি দিতে চাই, তবে এটি কাজ করতে কিছু সমস্যা হচ্ছে। আমি যদি তা করি R CMD BATCH my_script.R blablaতখন blablaআর স্ক্রিপ্ট সম্পাদিত হওয়ার জন্য উপলব্ধ আর্গুমেন্ট হিসাবে ব্যাখ্যা না করে আউটপুট ফাইল হয়ে যায়।

আমি চেষ্টা করেছি Rscript my_script.R blablaযা মনে হয় blablaসঠিকভাবে একটি আর্গুমেন্ট হিসাবে পাস করেছে , তবে তারপরে আমি my_script.Routযে আউটপুট ফাইলটি R CMD BATCHপাই তা পাই না (আমি .Routফাইলটি চাই )। আমি একটি কল আউটপুট পুনর্নির্দেশ পারে যদিও Rscriptআমার পছন্দসই একটি ফাইলের নাম, আমি আর ইনপুট কমান্ড ভাবে ফাইলে অন্তর্ভুক্ত পেয়ে হবে না R CMD BATCHমধ্যে আছে .Routফাইল।

সুতরাং, আদর্শভাবে, আমি R CMD BATCHপদ্ধতিটির মাধ্যমে কার্যকর করা একটি আর স্ক্রিপ্টের সাথে যুক্তিগুলি পাস করার একটি উপায় পরে করছি , যদিও Rscriptএটির তুলনামূলক .Routফাইল তৈরি করার কোনও উপায় আছে কিনা তা ব্যবহার করে এমন পদ্ধতির সাথে খুশি হব ।

উত্তর:


114

আমার অনুভূতিটি হ'ল R CMD BATCHকিছুটা অবলম্বন। যাই হোক না কেন, সাম্প্রতিকতম Rscriptএক্সিকিউটেবল (সমস্ত প্ল্যাটফর্মগুলিতে উপলব্ধ) একসাথে commandArgs()প্রসেসিং কমান্ড লাইনকে যুক্তিগুলি বেশ সহজ করে তোলে।

উদাহরণস্বরূপ, এখানে একটি ছোট স্ক্রিপ্ট - এটি কল করুন "myScript.R":

## myScript.R
args <- commandArgs(trailingOnly = TRUE)
rnorm(n=as.numeric(args[1]), mean=as.numeric(args[2]))

এবং কমান্ড লাইন থেকে এটি শুরু করার মত দেখাচ্ছে

> Rscript myScript.R 5 100
[1]  98.46435 100.04626  99.44937  98.52910 100.78853

সম্পাদনা:

আমি এটি সুপারিশ করতাম না, তবে ... এর সংমিশ্রণ ব্যবহার করে source()এবং sink()আপনি যে ফাইলটি Rscriptতৈরি করেছিলেন তেমন তৈরি করতে পারতেন । একটি উপায় হ'ল সামান্য আর স্ক্রিপ্ট তৈরি করা - কল করুন - যা আপনি সরাসরি স্ক্রিপ্টের মাধ্যমে কল করেন । এটি দেখতে এটির মতো দেখাবে:.RoutR CMD BATCH RscriptEcho.R

## RscriptEcho.R
args <- commandArgs(TRUE)
srcFile <- args[1]
outFile <- paste0(make.names(date()), ".Rout")
args <- args[-1]

sink(outFile, split = TRUE)
source(srcFile, echo = TRUE)

আপনার প্রকৃত স্ক্রিপ্টটি কার্যকর করতে, আপনি তখন এটি করবেন:

Rscript RscriptEcho.R myScript.R 5 100
[1]  98.46435 100.04626  99.44937  98.52910 100.78853

যা myScript.Rসরবরাহিত আর্গুমেন্টগুলির সাথে কার্যকর হবে এবং ইন্টারলিভড ইনপুট, আউটপুট এবং একটি অনন্যচিত্রে বার্তা ডুবিয়ে দেবে .Rout

সম্পাদনা 2:
আপনি রুপি স্ক্রিপ্টটি ভার্বোসালি চালাতে এবং ভার্বোজ আউটপুট একটি ফাইলে রাখতে পারেন।

Rscript --verbose myScript.R 5 100 > myScript.Rout

4
আমিও ছাপটি পেয়েছি R CMD BATCHa যদিও আমি এটির বিষয়ে পছন্দ করি তা হ'ল এটি এমন একটি .Routফাইল তৈরি করে যা কেবলমাত্র স্ক্রিপ্ট আউটপুটকেই অন্তর্ভুক্ত করে না, তবে .Rস্ক্রিপ্ট ফাইল থেকে ইনপুট কমান্ড / মন্তব্যগুলিও ইন্টারলিভ করে যা আউটপুট তৈরি করে।
ব্রাইস থমাস

1
আমি আপনাকে শুনতে পাচ্ছি. এটি ছিল (আমি এখনও অনুমান করি!) এর একটি সুন্দর দিক R CMD BATCH
জোশ

5
কিন্তু আমি মনে করি আপনি চেয়ে ভালো কিছু করতে পারি R CMD BATCHসঙ্গে knitr, যেমন Rscript -e "knitr::stitch(commandArgs(TRUE)[1])" my_script.R(আপনি প্রতিস্থাপন করতে পারেন stitchসঙ্গে stitch_rhtmlবা stitch_rmd, এবং আপনি ইনস্টল করতে হবে knitrথেকে গিটহাব যেহেতু আমি শুধু একটি বাগ খুঁজে পাওয়া যায় stitch...)
Yihui জাই

7
কেবল আমার 0.02 যুক্ত করতে টার্মিনাল থেকে পুনর্নির্দেশ ব্যবহার করাও সহজ। একটি উদাহরণ Rscript myfile.R > path/to/mylog.Routএবং পরিবর্তে stdout (স্ক্রিন) এ মুদ্রিত করা হবে, ফাইলের আউটপুট আপনার .Routফাইলে সংরক্ষণ করা হবে।
জেমস প্রিংল

4
@ জেমসপ্রিংলে যুক্ত করতে, আমি প্রায়শই আমার আউটপুট উভয়ই পর্দায় মুদ্রিত হতে চাই (বাস্তব সময়ে নিরীক্ষণ করতে) এবং একটি ফাইল (পরে দেখার জন্য)। আমি করিRscript myfile.R | tee mylog.Rout
হাইজেনবার্গ

26

এখানে বর্ণিত বিকল্পগুলির চেষ্টা করার পরে, আমি ফোরস্টার থেকে এই পোস্টটি আর-ব্লগারগুলিতে পেয়েছি । আমি বিবেচনা এটি একটি পরিষ্কার বিকল্প মনে করি।

আমি তার কোড এখানে রেখেছি:

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

$ R CMD BATCH --no-save --no-restore '--args a=1 b=c(2,5,6)' test.R test.out &

Test.R

##First read in the arguments listed at the command line
args=(commandArgs(TRUE))

##args is now a list of character vectors
## First check to see if arguments are passed.
## Then cycle through each element of the list and evaluate the expressions.
if(length(args)==0){
    print("No arguments supplied.")
    ##supply default values
    a = 1
    b = c(1,1,1)
}else{
    for(i in 1:length(args)){
      eval(parse(text=args[[i]]))
    }
}

print(a*2)
print(b*3)

পরীক্ষায়

> print(a*2)
[1] 2
> print(b*3)
[1]  6 15 18

ফরেস্টারকে ধন্যবাদ !


গুরুত্বপূর্ণ লক্ষণীয়, যদি আর্গুমেন্টগুলি টাইপ চরিত্রের হয় তবে একক / ডাবল উদ্ধৃতি ব্যবহার করার দরকার নেই। উদাহরণ: আর সিএমডি ব্যাচ '--args একটি = folderName' test.R test.out &
d2a2d

যেমন ফোরস্টার পোস্টে উল্লিখিত --argsহয়, চাবিকাঠি। এছাড়া সাথে কাজ করে R --no-save --no-restore --args a=1 < test.RএবংR --no-save --no-restore < test.R --args a=1
ডেভ

কমান্ড লাইন থেকে --args এ আর্গুমেন্টগুলি পাস করার কোনও উপায় আছে? সুতরাং বলুন আমরা কমান্ড লাইনে লুপের জন্য একটি করতে চাই এবং তারপরে এটি --args লাইনে প্রেরণ করব।
user2809432

9

আপনার আর স্ক্রিপ্টে, বলা হয়েছে test.R:

args <- commandArgs(trailingOnly = F)
myargument <- args[length(args)]
myargument <- sub("-","",myargument)
print(myargument)
q(save="no")

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

R CMD BATCH -4 test.R

আপনার আউটপুট ফাইল, test.Rout দেখাতে করবে যুক্তি 4সফলভাবে আর প্রেরণ করা হয়েছে:

cat test.Rout

> args <- commandArgs(trailingOnly = F)
> myargument <- args[length(args)]
> myargument <- sub("-","",myargument)
> print(myargument)
[1] "4"
> q(save="no")
> proc.time()
user  system elapsed 
0.222   0.022   0.236 

8

আপনার আগে আর্গুমেন্ট স্থাপন করা উচিত এবং যুক্তিগুলি my_script.Rব্যবহার -করা উচিত, যেমন

R CMD BATCH -blabla my_script.R

commandArgs()-blablaএই ক্ষেত্রে একটি চরিত্রের স্ট্রিং হিসাবে পাবেন । বিশদ জন্য সহায়তা দেখুন:

$ R CMD BATCH --help
Usage: R CMD BATCH [options] infile [outfile]

Run R non-interactively with input from infile and place output (stdout
and stderr) to another file.  If not given, the name of the output file
is the one of the input file, with a possible '.R' extension stripped,
and '.Rout' appended.

Options:
  -h, --help        print short help message and exit
  -v, --version     print version info and exit
  --no-timing           do not report the timings
  --            end processing of options

Further arguments starting with a '-' are considered as options as long
as '--' was not encountered, and are passed on to the R process, which
by default is started with '--restore --save --no-readline'.
See also help('BATCH') inside R.

2
আমি এই ভাবে এবং স্ক্রিপ্ট ব্যবহার না লক্ষ্য args <- commandArgs(FALSE)এবং তারপর args প্রিন্ট, আমি আর্গুমেন্ট দিয়ে শেষ, যারা যা খনি, মত নেই তাদেরকেও --restore, --saveইত্যাদি যদি আমি ব্যবহার commandArgs(TRUE)আমি এ সব কোন যুক্তি পেতে। আমার নিজের অতিরিক্ত যুক্তি পাওয়ার কোনও উপায় কি আছে? --argsপ্রতিশ্রুতিবদ্ধ দেখাচ্ছে, কিন্তু আমি এটি কাজে
লাগাতে

আপনাকে শেষ থেকে আর্গুমেন্টগুলি গণনা করতে হবে (উদাঃ আকার -২, আকার -১, আকার) - আপনার সর্বদা শেষে থাকবে।
ynka

4

আমি একটি উত্তর যুক্ত করি কারণ আমি মনে করি একটি ওয়ান লাইন সমাধান সর্বদা ভাল! আপনার myRscript.Rফাইলের শীর্ষে, নিম্নলিখিত লাইনটি যুক্ত করুন:

eval(parse(text=paste(commandArgs(trailingOnly = TRUE), collapse=";")))

তারপরে আপনার স্ক্রিপ্টটি এমন কিছুর সাথে জমা দিন:

R CMD BATCH [options] '--args arguments you want to supply' myRscript.R &

উদাহরণ স্বরূপ:

R CMD BATCH --vanilla '--args N=1 l=list(a=2, b="test") name="aname"' myscript.R &

তারপর:

> ls()
[1] "N"    "l"    "name"

0

কমান্ড লাইন আরগগুলি ব্যবহার করে এখানে প্রক্রিয়া করার আরও একটি উপায় R CMD BATCH। আমার পদ্ধতির, যা এখানে পূর্বের উত্তরের উপর ভিত্তি করে তৈরি করে , আপনাকে কমান্ড লাইনে আর্গুমেন্ট নির্দিষ্ট করতে দেয় এবং আপনার আর স্ক্রিপ্টে, তাদের কিছু বা সমস্ত ডিফল্ট মান দেয়।

এখানে একটি আর ফাইল, যা আমি নাম test.R :

defaults <- list(a=1, b=c(1,1,1)) ## default values of any arguments we might pass

## parse each command arg, loading it into global environment
for (arg in commandArgs(TRUE))
  eval(parse(text=arg))

## if any variable named in defaults doesn't exist, then create it
## with value from defaults
for (nm in names(defaults))
  assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]))[[1]])

print(a)
print(b)

কমান্ড লাইনে, যদি আমি টাইপ করি

R CMD BATCH --no-save --no-restore '--args a=2 b=c(2,5,6)' test.R

তারপরে আর এর মধ্যে আমাদের a= 2এবং b= থাকবে c(2,5,6)। তবে আমি বলতে পারি, বাদ দিতে bএবং অন্য যুক্তিতে যুক্ত করতে পারলাম c:

R CMD BATCH --no-save --no-restore '--args a=2 c="hello"' test.R

তারপরে আর-তে আমাদের a= 2, b= c(1,1,1)(ডিফল্ট) এবং c= থাকবে "hello"

পরিশেষে, সুবিধার জন্য আমরা যতক্ষণ না পরিবেশ সম্পর্কে সতর্ক থাকি ততক্ষণ একটি ফাংশনে আর কোডটি लपेटতে পারি:

## defaults should be either NULL or a named list
parseCommandArgs <- function(defaults=NULL, envir=globalenv()) {
  for (arg in commandArgs(TRUE))
    eval(parse(text=arg), envir=envir)

  for (nm in names(defaults))
    assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]), envir=envir)[[1]], pos=envir)
}

## example usage:
parseCommandArgs(list(a=1, b=c(1,1,1)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.