如何在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