如何索引R中file.path中的字符向量

时间:2015-07-23 18:58:08

标签: 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中编制file.path()索引?

3 个答案:

答案 0 :(得分:10)

我想你可以把它称为参数的列表,而不仅仅是一个。例如,您可以访问点的每个元素:

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

但你真正想做的是将每个作为个别参数传递。因此,在这种情况下,您需要明确地执行此操作(大量输入)或使用do.call,这允许您将参数列表传递给函数

cc <- c("", "a", "b", "c.txt")
do.call('file.path', as.list(cc))
# [1] "/a/b/c.txt"

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

或只是

do.call(base::mean, list(1:4))
# [1] 2.5

答案 1 :(得分:6)

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

do.call('file.path', as.list(cc))

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

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

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

答案 2 :(得分:3)

您可以使用paste代替collapse="/"。 所以:

cc <- c("", "a", "b", "c.txt")

你得到:

R> paste(cc, collapse="/")
[1] "/a/b/c.txt"