[英]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.list
和do.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.