在下面的函数中,我想控制输入,以便如果输入任何值但前三个选项(任何不等于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。如果不允许循环,可能会有不同的方法来获得相同的效果。
答案 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:')
}