繁体   English   中英

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

[英]How to index character vector in file.path in 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"

这看起来不对。 我想知道如何在file.path()索引cc

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

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

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

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

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

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

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

您可以使用带有collapse="/" paste 所以:

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

你得到:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM