循环回函数中的上一行

时间:2012-07-18 00:00:48

标签: r

在下面的函数中,我想控制输入,以便如果输入任何值但前三个选项(任何不等于1-3的值),则函数将循环回原始问题。

T<-function(){
Load<-readline("
Choose Task 
1 Task 1
2 Task 2
3 Task 3 ")
for(i in 1:10){
    if(Load=="")
    {print.noquote("No Value Entered"); Load<-readline("
Choose Task 
1 Task 1
2 Task 2
3 Task 3 ")
    }else
    if(Load==1)
    {source("/Users/JD/Desktop/R1.R")}
    else
    if(Load==2)
    {source("/Users/JD/Desktop/R2.R",print.eval=TRUE)}
    else
    if(Load==3)
    {source("/Users/JD/Desktop/R3.R",print.eval=TRUE)}
    else
    {print.noquote("Must enter 1-3"); ** loop back to "Choose Task"**}



}}

所以我在哪里**将循环回到代码的第二行。我已经控制了一个“空白”响应,但我想做一些类似的事情,不等于1-3。如果不允许循环,可能会有不同的方法来获得相同的效果。

3 个答案:

答案 0 :(得分:3)

您可以使用switch和递归

的组合
ChooseTask <- function() {
    Load <- readline("Choose Task. 1, 2, or 3: ")
    switch(Load, 
           "1"={cat("1", "\n")},
           "2"={cat("2", "\n")},
           "3"={cat("3", "\n")},
            {
                print.noquote("Must enter 1-3") 
                ChooseTask()
            })
}
> ChooseTask()
Choose Task. 1, 2, or 3: 2
2 
> ChooseTask()
Choose Task. 1, 2, or 3: 5
[1] Must enter 1-3
Choose Task. 1, 2, or 3: 1
1 

答案 1 :(得分:3)

我实际上会反对到目前为止提供的答案,并建议您使用方便的menu功能,它基本上可以为您提供所需的功能。

> menu(c("Task1", "Task2", "Task3"), title = "Choose Task")
Choose Task 

1: Task1
2: Task2
3: Task3

Selection: 4
Enter an item from the menu, or 0 to exit
Selection: 1
[1] 1

菜单的结果将为0,1,2或3.

编辑:为了取悦GSee ......这就是你如何改进它以实际做到用户想要的东西

T <- function(){
    choice <- menu(c("Task1", "Task2", "Task3"), title = "Choose Task, or 0 to exit")

    switch(choice,
           source("/Users/JD/Desktop/R1.R"),                    # 1
           source("/Users/JD/Dekstop/R2.R, print.eval = TRUE"), # 2
           source("/Users/JD/Desktop/R3.R, print.eval = TRUE")) # 3
}

如果用户选择0,则switch语句将不执行任何输入。

答案 2 :(得分:2)

您可以通过简单的循环执行此操作:

choice <- 0
while( !( choice %in% 1:3 ) ) {
   choice <- readline('Choose 1, 2, or 3:')
}