在R程序中请求用户输入的正确方法是什么?

Son*_*Son 31 user-input r readline

下面我的程序(分为两部分)可以单独运行 - 也就是说,如果我将第一部分粘贴到R控制台,运行它然后粘贴第二部分并运行它.但是,这不是我想要的.我想立刻运行整个程序.如果我这样做,它会在我的控制台中显示以下错误:

1: 
Read 0 items
1: 
Read 0 items
Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { : 
  argument is of length zero
Run Code Online (Sandbox Code Playgroud)

我试图找出问题,但我找不到根本原因.如果有人能帮助我,我会非常高兴.

#**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)
Run Code Online (Sandbox Code Playgroud)

Jor*_*eys 27

@Marek是对的.还有几点评论:

  • 一般来说,你不应该使用scan()但是readline()为此.
  • 我将代码拆分,以便更清楚读取n中的内容,以及用于读取内容的内容.
  • 想想当人们按下回车时你是否想要返回提示,或者你是否想重新问题直到他们填写一些正确的值.
  • 您可以使用权力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
}
Run Code Online (Sandbox Code Playgroud)

这显示了当人们没有填写任何内容时如何终止问题.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))
}
Run Code Online (Sandbox Code Playgroud)

这显示了当人们没有填写任何内容时如何重新提问.grepl排除任何不是数字或点的字符.


Mar*_*rek 9

这是因为当您复制并粘贴所有scan内容时,请将粘贴的行作为输入读取.

如果将此树行复制到控制台

x <- scan(nmax=1)
1
2
Run Code Online (Sandbox Code Playgroud)

x成为1,scan不要等待你的互动因为它有线阅读.

你必须包装所有内容{}:

{
 x <- scan(nmax=1)
 1
 2
}
Run Code Online (Sandbox Code Playgroud)

你必须包装程序的两个部分.更清楚:当您将代码粘贴到控制台时}应该是最后一个标志.