Как использовать stdin в R [duplicate]

Как пояснил @Ian , проблема в том, что jQuery's click() не совпадает с исходным.

Поэтому рассмотрим использование vanilla-js вместо jQuery:

var a = document.createElement('a');
a.href = "img.png";
a.download = "output.png";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);

Демо

260
задан monch1962 28 January 2010 в 00:40
поделиться

10 ответов

Ответ Дирка здесь - это все, что вам нужно. Ниже приведен минимальный воспроизводимый пример.

Я сделал два файла: 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:

193
ответ дан Sty 19 August 2018 в 05:51
поделиться

Попробуйте библиотеку (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();
}
12
ответ дан Erik Aronesty 19 August 2018 в 05:51
поделиться

вам нужно littler (произносится «маленький r»)

Дирк будет примерно через 15 минут для разработки;)

8
ответ дан JD Long 19 August 2018 в 05:51
поделиться
  • 1
    Я опоздал на семь минут. Должно быть, был плохой трафик на Intertubes. – Dirk Eddelbuettel 28 January 2010 в 02:12
  • 2
    либо это, либо вы стареете. ;) – JD Long 28 January 2010 в 16:15
  • 3
    Я явно не хорошо его читал. -1 для меня, не видя требования Windows – JD Long 28 January 2010 в 16:16

Я просто собрал хорошую структуру данных и цепочку обработки, чтобы генерировать это поведение переключения, никакие библиотеки не нужны. Я уверен, что это будет реализовано много раз, и наткнулся на эту тему, ища примеры - подумал, что я запишу.

Мне даже не нужны флаги (единственный флаг здесь режим отладки, создающий переменную, которую я проверяю как условие запуска нисходящей функции if (!exists(debug.mode)) {...} else {print(variables)}). Операторы проверки флагов lapply ниже имеют то же значение, что:

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, очевидно, желательно для любого серьезного скрипта, но код минимальной функциональности Хорошее тоже иногда.

Пример вывода:

$ Rscript check_mail.Rscript --help
--debug Print  variables rather than executing function XYZ...

-h  --help  Display flag definitions
0
ответ дан Louis Maddox 19 August 2018 в 05:51
поделиться

Поскольку 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.txt с 23 строками.

В командной строке:

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
ответ дан Megatron 19 August 2018 в 05:51
поделиться

В bash вы можете построить командную строку следующим образом:

$ 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 заменена оболочкой bash с «10», и это значение подбирается по commandArgs и подается в args[2], а команда диапазона x=1:10, выполненная R успешно, и т. д. и т. д.

5
ответ дан Paul Hiemstra 19 August 2018 в 05:51
поделиться

Несколько точек:

  1. Параметры командной строки доступны через commandArgs(), поэтому см. help(commandArgs) для обзора.
  2. Вы можете использовать Rscript.exe на всех платформах, включая Windows. Он будет поддерживать commandArgs(). littler можно портировать в Windows, но он живет прямо сейчас только на OS X и Linux.
  3. В CRAN есть два дополнительных пакета - getopt и optparse - которые были написаны для синтаксического анализа командной строки.

Редактировать в ноябре 2015: Появились новые альтернативы, и я всецело рекомендуют docopt .

117
ответ дан Spacedman 19 August 2018 в 05:51
поделиться

Добавьте это к началу своего скрипта:

args<-commandArgs(TRUE)

Затем вы можете обратиться к аргументам, переданным как args[1], args[2] и т. д.

Затем запустите

Rscript myscript.R arg1 arg2 arg3

Если ваши аргументы являются строками с пробелами в них, заключите их в двойные кавычки.

82
ответ дан The Unfun Cat 19 August 2018 в 05:51
поделиться
  • 1
    Это работает только тогда, когда я использовал args & lt; -commandArgs (TRUE) (обратите внимание на верхний регистр A). – Andy West 27 April 2012 в 03:24
  • 2
    вам нужны --args до arg1? – philcolbourn 24 May 2017 в 11:34
  • 3
    @philcolbourn Нет – Chris_Rands 19 February 2018 в 11:40

Если вам нужно указать опции с флагами (например, -h, --help, --number = 42 и т. д.), вы можете использовать оп пакетный пакет R (вдохновленный Python): http: // cran .r-project.org / web / packages / optparse / vignettes / optparse.pdf .

По крайней мере, так, как я понимаю ваш вопрос, потому что я нашел этот пост при поиске эквивалента bash getopt или perl Getopt, или python argparse и optparse.

0
ответ дан TheBinturonGggh 19 August 2018 в 05:51
поделиться

FYI: существует функция args (), которая извлекает аргументы из R-функций, а не путается с вектором аргументов args

3
ответ дан Tim 19 August 2018 в 05:51
поделиться
  • 1
    Это почти наверняка не так. Только функции могут маскировать функции. Создание переменной с тем же именем, что и функция, не маскирует функцию. См. Этот вопрос и ответы: stackoverflow.com/q/6135868/602276 – Andrie 9 November 2011 в 10:46
  • 2
    Правда, он не маскирует его. В общем, я стараюсь избегать именования функций и переменных с именами, которые уже существуют в R. – Tim 10 November 2011 в 04:46
Другие вопросы по тегам:

Похожие вопросы: