R:循环输入

时间:2012-08-07 14:23:55

标签: r input while-loop

我对R有点新意,对我正在尝试编写的程序有疑问。我希望通过while循环(最终在每个文件中使用read.table)接收文件(尽可能多的用户喜欢),但它一直在打破我。 以下是我到目前为止的情况:

cat("Please enter the full path for your files, if you have no more files to add enter 'X': ")
fil<-readLines(con="stdin", 1)
cat(fil, "\n")
while (!input=='X' | !input=='x'){
inputfile=input
input<- readline("Please enter the full path for your files, if you have no more files to add enter 'X': ")
}
if(input=='X' | input=='x'){
exit -1
}

当我运行它时(从命令行(UNIX))我得到这些结果:

> library("lattice")
> 
> cat("Please enter the full path for your files, if you have no more files to add enter 'X': ")
Please enter the full path for your files, if you have no more files to add enter 'X': > fil<-readLines(con="stdin", 1)
x
> cat(fil, "\n")
x 
> while (!input=='X' | !input=='x'){ 
+ inputfile=input
+ input<- readline("Please enter the full path for your files, if you have no more files to add enter 'X': ")
+ }
Error: object 'input' not found
Execution halted

我不太确定如何解决问题,但我很确定这可能是一个简单的问题。 有什么建议? 谢谢!

2 个答案:

答案 0 :(得分:3)

当您第一次运行脚本输入时不存在。分配

input<-c() 

在你的while语句之前说或者说 inputfile=input 低于input<- readline....

答案 1 :(得分:1)

我不确定您的问题的根本问题是什么。可能是您输入的目录路径不正确。

这是我用了几次的解决方案。它使用户更容易。基本上,您的代码不需要用户输入,只需要您对文件有一定的命名约定即可。

setwd("Your/Working/Directory") #This doesn't change
filecontents <- 1
i <- 1
while (filecontents != 0) {
    mydata.csv <- try(read.csv(paste("CSV_file_",i,".csv", sep = ""), header = FALSE), silent = TRUE)
    if (typeof(mydata.csv) != "list") { #checks to see if the imported data is a list
        filecontents <- 0   
    }
    else {
        assign(paste('dataset',i, sep=''), mydata)
        #Whatever operations you want to do on the files.  
        i <- i + 1
    }
}

正如您所看到的,文件的命名约定是CSV_file_n,其中n是任意数量的输入文件(我从我的一个程序中获取此代码,其中我加载了csv) 。当我的代码查找不存在的文件时,我遇到的一个问题是Error消息弹出。通过此循环,不会出现这些消息。如果它将不存在的文件的内容分配给mydata.csv,它只会检查mydata.csv是否为列表。如果是,它继续运行。如果没有,它就会停止。如果您担心区分代码中不同文件的数据,只需在文件本身的常量位置插入有关该文件的任何相关信息。例如,在我的csv中,我的第3列总是包含图像的名称,我从中收集了其余csv中包含的信息。

希望这对你有所帮助,即使我看到你已经有了解决方案:-)。如果您希望您的程序更加自主,那么这只是一个选项。