3

我有 2 个文件: 1. 子文件:get_input_template.R :此文件包含从用户获取输入的功能。

####################################
fun <- function(){
  x <- readline("What is the value of x?")  
  x <- as.numeric(unlist(strsplit(x, ",")))
  return(x)
}
####################################
  1. main.R:该文件是主函数,它将: 步骤 1:调用第一个文件以询问用户输入值并将该值分配给变量 n。第2步:继续在我的主程序中做一些事情。让我们做一个简单的任务,例如,打印出 n 的值。

这是我的程序:

####################################
source("get_input_template.R")
n<-fun()
sprintf("input value n = %s",n)
####################################

问题是,当我完全运行我的主程序时,它会显示一个错误,因为它不会停在第二行 n<-fun() 供用户输入值。因此,我得到一个错误:

---------------------------
Warning message:
In fun() : NAs introduced by coercion
---------------------------

我怎么能说 R 在第二行停止运行,并允许用户输入数据,然后将该输入打印到控制台中。我知道我可以通过将 sprintf("input value n = %s",n) 移动到子文件中来修复它,但这不是我想要的方式。如果我只想将那行代码保留在主文件中,我该怎么做?

提前致谢。

4

1 回答 1

1

这是由R解析和解释代码的方式引起的,为了更简单,发生的事情与

> source("get_input_template.R") # you run this
> n<-fun()                       # then this
What is the value of x?          # this appears and instead of giving the value you run
sprintf("input value n = %s",n)  #  you run this final line

如果在你看到这个print(x)之后添加readline

> source("UI/read console.R")
>   n<-fun()
What is the value of x?  sprintf("input value n = %s",n) # at this point R pauses and it is provided with "sprintf("input value n = %s",n)" as value of x
[1] "sprintf(\"input value n = %s\",n)"
Warning message:
In fun() : NAs introduced by coercion

您可以通过将代码包装在函数中来解决此问题

f <- function(){
  source("UI/read console.R")
  n<-fun()
  sprintf("input value n = %s",n)
}

然后只是运行:

f()

它之所以与众不同的原因是,运行一堆行会R一个接一个地执行它们,只要一个语句完成,就会运行以下语句(在您的问题中,第三行作为第二行的输入提供:))。在函数中不会发生这种情况,其中的所有代码就像一个语句(函数本身)的一部分,因此,当 R 要求您输入某些内容时,不会执行以下行。

于 2013-10-11T16:56:03.583 回答