R:根据用户输入构造文件路径

时间:2012-02-24 10:50:03

标签: r path directory

我有两个变量work.dirmy.file。这意味着用户希望将my.file保存到work.dir。要求用户输入work.dir路径,这就是它变得棘手的地方。如果用户输入work.dir路径

c:/temp/

我尝试用pastemy.name,我会得到

c:/temp/my.file

但如果用户输入

c:/temp

我会得到

c:/tempmy.file

到目前为止,我一直在与提取work.dir的各个部分进行斗争并将它们粘在一起以实现一致性,但我想知道是否有另一种方式(可能更具弹性)?

到目前为止,这是我获得一个可用于与文件名粘贴在一起的一致目录的解决方案。

work.dir <- "c:/temp"
work.dir <- paste(dirname(work.dir), basename(work.dir), sep = "")

1 个答案:

答案 0 :(得分:2)

James理所当然地指出,在大多数情况下,目录将被正确解释。如果这不满足您,并假设您的用户知道他或她不应该在他的目录中使用反斜杠,您可以使用file.path()来解决您的问题,例如:

makepath <- function(path,file){
  path <- as.list(strsplit(path,'/')[[1]])
  do.call(file.path,c(path,file))
}

如果您的用户可能使用Windows反斜杠(并忘记他必须使用另一个反斜杠转义它们),您可以添加以下控件:

makepath <- function(path,file){
  if(grepl('[^[:graph:]]',path)) 
    stop("Invalid characters. Check you didn't use a single \\")
  win <- grepl('\\\\',path)
  sep <- if(win) '\\\\' else '/'
  path <- as.list(strsplit(path,sep)[[1]])
  do.call(file.path,c(path,file))
}

这给出了:

> makepath('c:\\temp','myfile')
[1] "c:/temp/myfile"
> makepath('c:\\temp\\','myfile')
[1] "c:/temp/myfile"
> makepath('c:/temp','myfile')
[1] "c:/temp/myfile"
> makepath('c:/temp/','myfile')
[1] "c:/temp/myfile"