2015-07-23 14 views
9

yılında file.path dizin karakter vektör için: Yaparsam nasıl R

file.path("", "a", "b", "c.txt") 
[1] "https://stackoverflow.com/a/b/c.txt" 

Doğru dosya yolunu var, ama bu şekilde yaparsak:

cc<-c("", "a", "b", "c.txt") 
file.path(cc) 
[1] ""  "a"  "b"  "c.txt" 

Bu yanlış görünüyor. file.path() içinde cc endeksini nasıl merak ediyorum?

+3

'do.call ('file.path', as.list (cc)) ben file.path kullanmak' – rawr

cevap

10

Sana sadece tek bir yerine argümanların bu liste diyebilirsin. Örneğin, noktaların her unsuru erişebilirsiniz:

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 

Ama ne gerçekten yapmak istediğiniz tek tek argüman olarak her pass. Yani bu durumda, açıkça (yazarak bir sürü) bunu veya fonksiyonlara parametre listesini geçmesine izin veren do.call kullanmak için her ihtiyaç

cc <- c("", "a", "b", "c.txt") 
do.call('file.path', as.list(cc)) 
# [1] "https://stackoverflow.com/a/b/c.txt" 

file.path yılında güzel sadece iki argüman, bir olduğunu bunların bu kadar bu durumda her argüman maç için işleve bir adlı listesini geçmesi gerekiyor değiştirmek ancak yaptığını eğer

do.call('file.path', c(as.list(cc), fsep = '/xx/')) 
# [1] "/xx/a/xx/b/xx/c.txt" 

yapabileceğini gerekmez

rastlamak Bir yan not, belirli bir pakette bir işlevi belirtmek gerekirse çalışmaz

do.call('base::mean', list(1:4)) 
# Error in do.call("base::mean", list(1:4)) : 
# could not find function "base::mean" 

gibi bir şey. Sen

f <- base:::mean; do.call('f', list(1:4)) 
# [1] 2.5 

yoksa Rawr kabul ettiği cevabı/yorum olarak aynı göndermek üzereyken

do.call(base::mean, list(1:4)) 
# [1] 2.5 
+1

İlginç bir şekilde, 'do.call' (base :: "mean", list (1: 4)) çalışır, ama umarım kimse bunu yapamazdı. –

+0

'do.call', ilk argümanını ayrıştırmayı beklemez, ancak ilk önce bir işlev ismine göre değerlendirilirse, standart dışı bir değerlendirme yaptığı için bunu kabul eder. –

+0

@BondedDust Görüyorum .. Ayrıştırma "kütüphane ('x')" kütüphane (x) 'den – rawr

3

yerine collapse="/" ile paste kullanabilirsiniz. yüzden üstünde:

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

Alacağınız:

R> paste(cc, collapse="/") 
[1] "https://stackoverflow.com/a/b/c.txt" 
+0

nedeni: adlandırılmış bağımsız değişken içeren bir işleve geçirmeden Eğer biri listeleri veya pairlists birini kullanabilirsiniz) paste() kullanmaktan kaçınmaktır. –

+1

file.path() windows ve mac gibi platformlar arasındaki farkı tanıyabilir. –

+0

Tamam, anlıyorum. Sonra rawr'in yukarıdaki yorumu çok daha iyi bir çözüm. – christoph

5

yapmanız gereken ya (bu yüzden ona bir cevap göndermek için bekledikten sonra biraz daha eklemeye karar onun şimdi bir cevap var mı bakın etse de daha sonra) bekleyen vazgeçerek:

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

Öğrenme as.list ve do.call kullanmak bu derslerden biriydi ben birkaç yıl yapmak öğrenilen benim şimdiki daimi ara Ar ustalık yolunda wn. Rawr cevabı işleri nedeni file.path için argümanlar liste olarak işlev args bileşenine gelmek gerekir olmasıdır. basitçe list() sarılarak nedeni, örneğin file.path(list(cc)), başarısız as.list fonksiyon uzunluğu-4 listesini oluşturur oysa sonuç, uzunluk biri listesidir olmasıdır. file.path(as.list(cc)) da başarısız kullanarak nedeni ayrıştırıcı hala tek vektörü olarak bu argüman üzerinde döngüler olmasıdır.

Bazen do.call argüman değerleri ... (nokta) ile temin edilecek bir fonksiyonun bileşeni gidiş ama bazı diğer veri-nesne mevcut olduğunda bir işlevi call inşa etmenin tek yolu budur. (

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