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