2

在下面的函数中,我想控制输入,以便如果输入除前三个选项之外的任何值(任何不等于 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 的任何东西做类似的事情。如果不允许环回,也许有不同的方法可以获得相同的效果。

4

3 回答 3

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 
于 2012-07-18T00:20:03.383 回答
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

menu 的结果将是 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 语句将不会执行任何输入。

于 2012-07-18T17:28:58.100 回答
2

你可以用一个简单的循环来做到这一点:

choice <- 0
while( !( choice %in% 1:3 ) ) {
   choice <- readline('Choose 1, 2, or 3:')
}
于 2012-07-18T17:05:28.020 回答