我正在组装一些路径到文件的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
有效构建这些可变长度的网址吗?
答案 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
来处理元素回收,然后使用split
和lapply
来执行正确的转换。在这里,我编写一个辅助函数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"