如果我单独运行它,下面的程序(由两部分组成)也可以运行 - 也就是说,如果我将第一部分粘贴到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)
答案 0 :(得分:27)
@Marek是对的。还有一些评论:
scan()
而是readline()
。 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排除任何不是数字或点的字符。
答案 1 :(得分:9)
这是因为当您复制并粘贴所有内容时,scan
读取粘贴的行作为输入。
如果将此树线复制到控制台
x <- scan(nmax=1)
1
2
x
成为1
,scan
不等待您的互动,因为它有线阅读。
你必须将所有内容都包装在{}
:
{
x <- scan(nmax=1)
1
2
}
你必须包装程序的两个部分。更清楚一点:当您将代码粘贴到控制台}
时,应该是最后一次签名。