如何在R中为file.path中的字符向量编制索引

如何在R中为file.path中的字符向量编制索引,r,R,如果我这样做: file.path("", "a", "b", "c.txt") [1] "/a/b/c.txt" 我得到了正确的文件路径,但如果我这样做: cc<-c("", "a", "b", "c.txt") file.path(cc) [1] "" "a" "b" "c.txt" cc您可以将paste与collapse=“/”一起使用。 因此: 我想你可以称之为一系列论点,而不仅仅是一个论点。例如,您可以访问点的每个元素: f <- funct

如果我这样做:

file.path("", "a", "b", "c.txt")
[1] "/a/b/c.txt"
我得到了正确的文件路径,但如果我这样做:

cc<-c("", "a", "b", "c.txt")
file.path(cc)
[1] ""      "a"     "b"     "c.txt"

cc您可以将
paste
collapse=“/”
一起使用。 因此:


我想你可以称之为一系列论点,而不仅仅是一个论点。例如,您可以访问点的每个元素:

f <- function(...) {
  list(one = ..1,
       three = ..3,
       four = ..4,
       two = ..2)
}
f(1, 2, 3, 4)

# $one
# [1] 1
# 
# $three
# [1] 3
# 
# $four
# [1] 4
# 
# $two
# [1] 2
file.path
很好,因为它只有两个参数,其中一个不需要更改,但如果更改了,则可以更改

do.call('file.path', c(as.list(cc), fsep = '/xx/'))
# [1] "/xx/a/xx/b/xx/c.txt"
因此,在本例中,您需要将命名列表传递给函数以匹配每个参数

我遇到的一个旁注,比如

do.call('base::mean', list(1:4))
# Error in do.call("base::mean", list(1:4)) : 
#   could not find function "base::mean"
如果您需要在特定的包中指定函数,则无法使用。你要么需要做

f <- base:::mean; do.call('f', list(1:4))
# [1] 2.5

我正要发布与rawr接受的答案/评论相同的内容(因此在等待他发布答案后,我决定再添加一点内容,然后放弃等待,尽管我看到他现在确实有答案):

学习使用
as.list
do.call
是我几年来一直学到的经验之一。rawr的答案之所以有效,是因为
file.path
的参数需要作为列表到达函数的args组件。简单地用
list()
包装它们(例如
file.path(list(cc))
)失败的原因是结果是长度为1的列表,而
as.list
函数创建长度为4的列表。使用
file.path(as.list(cc))
也失败的原因是解析器仍然将该参数作为单个向量循环

有时,当参数值将被提供给函数的
(dots)组件但存在于其他数据对象中时,调用
是构建函数的唯一方法。如果传递给具有命名参数的函数,则可以使用列表或成对列表:

> dd <- list(from=1, to=2)
> seq(dd)
[1] 1 2
>dd-seq(dd)
[1] 1 2

我使用file.path()的原因是为了避免使用粘贴()。file.path()可以识别windows和mac等平台之间的差异。好的,我明白了。那么rawr上面的评论是一个更好的解决方案。@rawr用你的评论回答问题。在有人发布一个
dplyr
解决方案之前。@rawr我会把帖子留给你作为答案。
do.call('file.path',as.list(cc))
有趣的是,
do.call(base:“mean”,list(1:4))
起作用,但希望没有人会这么做。
do.call
不希望解析它的第一个参数,但如果它第一次被求值为函数名,它将接受它,因为它进行非标准求值。@BondedDust我明白了。。我认为解析会“更安全”,就像
library('x')
library(x)
更安全一样,但是
base::mean
不是函数名。它失败了,
is.name('base::mean')
-test我明白你的意思了
do.call('base::mean', list(1:4))
# Error in do.call("base::mean", list(1:4)) : 
#   could not find function "base::mean"
f <- base:::mean; do.call('f', list(1:4))
# [1] 2.5
do.call(base::mean, list(1:4))
# [1] 2.5
do.call('file.path', as.list(cc))
> dd <- list(from=1, to=2)
> seq(dd)
[1] 1 2