Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R程序中请求用户输入的正确方法是什么?_R_User Input_Readline - Fatal编程技术网

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

在R程序中请求用户输入的正确方法是什么?,r,user-input,readline,R,User Input,Readline,如果我分别运行下面的my程序(分为两个部分),那么它可以工作——也就是说,如果我将第一部分粘贴到R控制台中,运行它,然后粘贴第二部分并运行它。然而,这不是我想要的。我想立刻运行整个程序。如果我这样做,它会在我的控制台中显示以下错误: 1: Read 0 items 1: Read 0 items Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { : argument is of length zero whi

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

1: 
Read 0 items
1: 
Read 0 items
Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { : 
  argument is of length zero
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
}
1:
读取0项
1: 
读取0项

while中出现错误((n这是因为当您复制并粘贴所有内容时,
scan
会将粘贴的行作为输入读取

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

x <- scan(nmax=1)
1
2

您必须包装程序的两个部分。更清楚地说:当您将代码粘贴到控制台时,
应该是最后一个符号。

@Marek说得很对。还有几句话:

  • 一般来说,您不应该为此使用
    scan()
    ,而应该使用
    readline()
  • 我将代码拆分,这样就可以清楚地知道在n中读取什么,在acr中读取什么
  • 考虑一下当人们只需按enter键时是否要返回提示,或者是否要重新询问问题,直到他们填写正确的值为止
  • 您可以使用
    grepl()
    的功能来检查输入的格式是否正确
为了包含正确的控件并捕获所有可能的错误,以下构造更简洁,在复制到控制台时不会破坏代码:

1: 
Read 0 items
1: 
Read 0 items
Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { : 
  argument is of length zero
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
}
while(n<1){

n@Son:我编辑了你的问题以澄清问题。请在你的问题中提供有关你所看到的错误的完整信息。这将使你得到更快的回答。使用
readlines()
而不是
scan
的解决方案已经提交给了@Son。@Joris Meys+1,感谢你提到
grepl()
。嗨,Joris,非常感谢你的回答。它终于起作用了。幸好你没有为我把它们放在一起。在与它斗争了大约4小时后,它起了作用。我在网站的常见问题解答中读到了这一点:“当你决定哪个答案对你最有帮助时,点击复选框大纲,将其标记为已接受的答案。”但我找不到有问题的复选框大纲。我同样非常感谢梅雷克
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))
}