2017-01-02 2 views
0

У меня возникли проблемы с моим R-скриптом, потому что я хочу использовать его из сценария bash. Моя проблема возникает, когда я называю сценарий и ввести свои аргументы, я использую следующую командуКак читать аргументы как числовой вектор

Rscript myscript.R 1,2,1,3,2,3 

Я хочу использовать аргумент «1,2,1,3,2,3» в качестве числового вектора чтобы использовать его длину и элементы. Таким образом, в myscript.R код:

args <- commandArgs(trailingOnly=TRUE) 
comparisons <- args[1] 

, но когда я использую эту переменную comparisons для других вещей он приходит сообщение об ошибке: сообщение

for (i in seq(from = 1, to = length(comparisons)-1, by = 2)) 
{ 
... 
} 

Ошибка:

Error in seq.default(from = 1, to = (length(comparisons) - 1), by = 2) : 
wrong sign in 'by' argument 
Calls: seq -> seq.default 
Execution halted 

Как может Я читал аргумент comparisons как числовой вектор?

+1

Он по-прежнему работает от интерпретатора 'r', не имеет ничего общего с' bash', удаляя тег. – Inian

ответ

2

С вашим кодом сравнения - это только одноэлементный вектор-строка, таким образом, (length(comparisons) - 1) = 0. Это приводит к уменьшению from 1 -> to 0, но by 2 является положительным, поэтому seq терпит неудачу.

Вы можете использовать этот код, чтобы преобразовать его в числовой вектор

comparisons <- unlist(lapply(strsplit(comparisons, ","), as.numeric)) 
+0

Большое вам спасибо, это прекрасно работает и решает мою проблему! –

2

scan() функция является часто упускается из виду, но очень полезный и универсальный инструмент:

scan(text=args[1], sep=",", quiet=TRUE) 

Если вы не необходимо double с:

scan(text=args[1], what=integer(), sep=",", quiet=TRUE) 

Будет ли giv e вы целые.

Смежные вопросы