Каков правильный способ запросить ввод пользователя в программе R?
Моя программа ниже (которая состоит из двух частей) работает, если я запускаю их отдельно - то есть, если я вставляю первую часть в R-консоль, запускаю ее, а затем вставляю вторую и запускаю ее. Однако я не хочу этого делать. Я хочу запустить всю программу сразу. Если я это сделаю, в моей консоли появится следующая ошибка:
1:
Read 0 items
1:
Read 0 items
Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { :
argument is of length zero
Я попытался идентифицировать проблему, но мне не удалось найти основную причину. Я был бы более чем рад, если бы кто-нибудь мог прийти мне на помощь.
#**FIRST PART OF THE PROGRAM**
n <- -2
acr <- -2
while((n<=0) | (acr<=0) | (acr>=1)) {
print("enter a positive integer and the average cancellation rate between 0 and 1
you want")
try(n <- scan(what=integer(), nmax=1), silent=TRUE)
try(acr <- scan(what=double(), nmax=1), silent=TRUE)
}
#**SECOND PART OF THE PROGRAM**
bygrace <- read.table("C:\\MyRfolder\\bygrace.txt", header=FALSE)
r <- nrow(bygrace)
c <- ncol(bygrace)
copybygrace <- array(bygrace, dim=c(r, c))
copybygrace <- bygrace[-((n+1):r), ]
write.table(copybygrace,file="C:\\MyRfolder\\copybygrace.txt", sep="\t")
copybygrace <- read.table("C:\\MyRfolder\\copybygrace.txt", header=TRUE)
Ответы
Ответ 1
@Marek очень прав. Еще несколько замечаний:
- В общем, вы не должны использовать
scan()
, но readline()
для этого.
- Я бы разделил код, чтобы стало ясно, что читается в n, и что читается на acr.
- подумайте, хотите ли вы вернуться к подсказке, когда люди просто нажимают кнопку ввода, или вы хотите задать вопрос до тех пор, пока не заполнит какое-то правильное значение.
- вы можете использовать мощность
grepl()
для проверки правильности ввода.
Чтобы включить правильные элементы управления и поймать все возможные ошибки, следующая конструкция намного чище и не будет разбивать ваш код при копировании на консоль:
while(n < 1 ){
n <- readline("enter a positive integer: ")
n <- ifelse(grepl("\\D",n),-1,as.integer(n))
if(is.na(n)){break} # breaks when hit enter
}
Это показывает, как прервать вопрос, когда люди ничего не заполняют. Конструкция grepl исключает любой символ, который не является цифрой, включая точку.
while(is.na(acr) | acr <= 0 | acr >= 1 ){
acr <- readline("and the average cancellation rate between 0 and 1 :")
acr <- ifelse(grepl("[^0-9.]",acr),-1,as.numeric(acr))
}
Это показывает, как задать вопрос, когда люди ничего не заполняют. Grepl исключает любой символ, который не является цифрой или точкой.
Ответ 2
Это потому, что, когда вы копируете и вставляете все, то scan
считывает вставляемые вставляемые строки.
Если вы скопируете эти строки дерева в консоль
x <- scan(nmax=1)
1
2
x
стать 1
, scan
не дожидаться, когда ваше взаимодействие приведет к тому, что он получил строку для чтения.
Вы должны обернуть все в {}
:
{
x <- scan(nmax=1)
1
2
}
Вы должны обернуть обе части своей программы. Чтобы быть более понятным: при вставке кода в консоль }
должен быть последний знак.