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

R:从用户输入构造文件路径,r,path,directory,R,Path,Directory,我有两个变量,work.dir和my.file。这意味着用户希望将my.file保存到work.dir。用户被要求输入work.dir路径,这就是它变得棘手的地方。如果用户输入work.dirpath c:/temp/ 我试着用我的名字粘贴这个,我会得到 c:/temp/my.file 但是如果用户输入 c:/temp 我会得到 c:/tempmy.file 到目前为止,我一直在通过提取work.dir的各个部分并将其粘在一起以实现一致性来解决这个问题,但我想知道是否还有其他方法(可能更具弹性)

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

c:/temp/

我试着用
我的名字
粘贴
这个,我会得到

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 = "")

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

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

我认为
c:/temp//my.file
的解释是可以的,因此
粘贴(work.dir、my.name、sep=“/”)
应该在这两种情况下都可以使用,不需要真正包装它。使用file.path是不够的。R甚至会正确地映射像“C:\\temp\\\\\/myfile”这样的愚蠢的东西。@Hansi可能是,但是如果一个包告诉我一个文件保存在“C:\\temp\\\\\\\/myfile”中,我会问自己这个包有什么问题。另外,R不能正确解释“C:\temp\\myfile”,这也是您可以期望的输入。
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"