簡體   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