The my program below(which is in two parts) works if I run them separately – that is, if I paste the first part into the R Console, run it and then paste the second and ru
@Marek is very right. A few more remarks :
scan()
but readline()
for this. grepl()
to check whether the input is the right format.To include the correct controls and catch all possible mistakes, the following construct is a lot cleaner and won't break your code when copied to the console :
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
}
This shows how to terminate the question when people don't fill in anything. The grepl construct exludes any character that is not a digit, including the dot.
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))
}
This shows how to re-ask the question when people don't fill in anything. The grepl excludes any character that is not a digit or a dot.
It's because when you copy and paste all then scan
reads pasted lines as input.
If you copy this tree lines to console
x <- scan(nmax=1)
1
2
x
become 1
, scan
don't wait for your interaction cause it got line to read.
You have to wrap everything in {}
:
{
x <- scan(nmax=1)
1
2
}
You have to wrap both parts of your program. To be more clear: when you paste your code to console }
should be last sign.