如何在调用函数后继续在主文件中运行代码,以便在R编程中从用户获取输入值

时间:2013-10-11 16:08:40

标签: r

我有2个文件: 1. sub file: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的值。
  2. 这是我的计划:

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

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

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

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

    提前致谢。

1 个答案:

答案 0 :(得分: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要求您键入内容时,以下行不会被执行。