我有两个变量work.dir
和my.file
。这意味着用户希望将my.file
保存到work.dir
。要求用户输入work.dir
路径,这就是它变得棘手的地方。如果用户输入work.dir
路径
c:/temp/
我尝试用paste
来my.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 = "")
答案 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"