file.path()与paste()一起创建不同长度的URL

时间:2014-07-07 02:10:22

标签: r

我正在组装一些路径到文件的URL。很多以前,我会使用paste,但现在我们有file.path这应该更快。我拍摄的结果是

[1] "http://www.retrosheet.org/gamelogs/glfields.txt"   
[2] "http://www.retrosheet.org/schedule/schedFields.txt"
[3] "http://www.retrosheet.org/boxfile.txt"  

请注意,第三个网址没有"中间"部分/.../与其他两部分一样。所以我使用file.path尝试以下内容,并按预期获得不正确的第三个元素。

dir <- "http://www.retrosheet.org"
mid <- c("gamelogs", "schedule", "")
end <- c("glfields.txt", "schedFields.txt", "boxfile.txt")
file.path(dir, mid, end)[3]
# [3] "http://www.retrosheet.org//boxfile.txt"     

mid的第三个元素更改为NULL只会重新"gamelogs",这很奇怪。

mid[3] <- NULL
file.path(dir, mid, end)[3]
# [3] "http://www.retrosheet.org/gamelogs/boxfile.txt"  

似乎我可以通过这种方式获得结果,但是为什么不使用paste0(dir, mid, end)而不使用任何参数呢?

dir <- "http://www.retrosheet.org/"
mid <- c("gamelogs/", "schedule/", "")
file.path(dir, mid, end, fsep = "")
# [1] "http://www.retrosheet.org/gamelogs/glfields.txt"   
# [2] "http://www.retrosheet.org/schedule/schedFields.txt"
# [3] "http://www.retrosheet.org/boxfile.txt" 

使用 file.path有效构建这些可变长度的网址吗?

2 个答案:

答案 0 :(得分:2)

file.path()适用于本地路径,不适用于网址。不要将它用于URL,或者至少明确地提供分隔符,否则如果分隔符在Windows上更改为\\,您将来可能会感到惊讶。

file.path()声称速度更快,平均来说可能确实稍快一些:

system.time(file.path("foo", 1:1000000, fsep="/"))
#  user  system elapsed 
# 0.450   0.000   0.451 

system.time(paste0("foo", 1:1000000))
# user  system elapsed 
# 0.602   0.008   0.611 

所以我想说,只要使用paste0(),就可以了。

paste()paste0()的唯一问题是代码无法读取,但file.path()也是如此。

答案 1 :(得分:1)

看起来你生成这些的方式有点奇怪。如果您在中间进一步分离文件夹怎么办?如果你有可变长度值,那么看起来像这样的三个变量有点奇怪。可能有更好的方法来存储这些信息。

无论如何,一种可能性是使用cbind来处理元素回收,然后使用splitlapply来执行正确的转换。在这里,我编写一个辅助函数blank.omit来从向量中删除零长度元素。正如您所知,file.path不会自动删除它们。

#helpers
blank.omit <- function(x) x[nchar(x)>0]
file.path.vector <- function(x) do.call(file.path, as.list(x))

#transformation
V<-cbind(dir, mid, end)
sapply(lapply(split(V, seq.int(nrow(V))), blank.omit), file.path.vector)

返回

                                                   1 
   "http://www.retrosheet.org/gamelogs/glfields.txt" 
                                                   2 
"http://www.retrosheet.org/schedule/schedFields.txt" 
                                                   3 
             "http://www.retrosheet.org/boxfile.txt"