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"