2017-04-07 73 views
15

ile çalışmaz.
Bu kod satırından başka bir satıra dönüştürmeye çalışırken, çalışmaz. R boru (%>%) Ben boru fonksiyonunu (%>%) öğrenmeye çalışıyorum suret fonksiyonu

---- R kodu - orijinal versiyon -----

set.seed(1014) 
replicate(6,sample(1:8)) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 3 7 4 5 1 
[2,] 2 8 4 2 4 2 
[3,] 5 4 8 5 8 5 
[4,] 3 1 2 1 1 7 
[5,] 4 6 3 7 7 3 
[6,] 6 5 1 3 3 8 
[7,] 8 7 5 8 6 6 
[8,] 7 2 6 6 2 4 

---- R kodu - boru ile Recoded ----

> sample(1:8) %>% replicate(6,.) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 7 7 7 7 7 7 
[2,] 3 3 3 3 3 3 
[3,] 2 2 2 2 2 2 
[4,] 1 1 1 1 1 1 
[5,] 5 5 5 5 5 5 
[6,] 4 4 4 4 4 4 
[7,] 8 8 8 8 8 8 
[8,] 6 6 6 6 6 6 

Bildirim bu Boruları kullanırken, örnekleme bana aynı vektörü vererek işe yaramaz. var

+5

kod, replikat örnek fonksiyonu 6 kez yürütüyor. İkinci kodda, çıktıya örnek işlevine verilir ve bu çıkışı 6 kez çoğaltırsınız. – student

cevap

19

beklenebilir. replicate bir ifade bekler, ancak sadece pipon operatörü kullanırken sample() aramasının sonucunu replicate'a yapıştırırsınız. Yani 6 kat aynı sonucu elde edersiniz.

quote()'u kullanarak, sonuç yerine çoğaltılacak ifadeyi geçirmeniz gerekir, ancak bu ifadenin her yinelemesini değerlendirmeyi unutmamalısınız.

quote(sample(c(1:10,-99),6,rep=TRUE)) %>% 
    replicate(6, .) %>% 
    sapply(eval) 

verir:

[,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 5 2 10 10 9 2 
[2,] 4 3 1 3 -99 1 
[3,] 10 2 3 8 2 4 
[4,] -99 1 6 2 10 3 
[5,] 8 -99 1 9 4 6 
[6,] 4 10 8 1 -99 8 

burada ne olur:

  • boru gönderir ve ifade onu değerlendirilmeden çoğaltmak için.
  • kopya olduğunu ifade çoğaltır ve 6 kez bu ifade ile ancak değerlendirilmeden bir listesini döndürür. (Eval)
  • sapply listesi geçer ve bu listedeki her ifade yürütür. (Data.frame kullanırken yani) önceki soruya ise

, sen yapmış olabilir mesela:

Şimdi ifadeleri zorlardı fonksiyon data.frame yürütülecek, ama aynı zamanda ile bitirmek
quote(sample(c(1:10,-99),6,rep=TRUE)) %>% 
    replicate(6, .) %>% 
    data.frame 

korkunç değişken isimler, yani ifadenin kendisi.

burada sorunlar hakkında daha fazla bilgi edinmek istiyorsanız, "tembel değerlendirme" denilen ve ne dalmak gerekecek tam olarak boru operatör tarafından nasıl ele alındığını. Ama tüm dürüstlükte, bu durumda boru operatörünü kullanma konusunda hiçbir avantaj görmüyorum. Daha fazla okunabilir değil. Frank'in yorumun gereğince

: Sen sapply önlemek için boru ve fonksiyonların yuvalama bir karışımını kullanabilirsiniz. Ama bunun için, doğru şekilde işlemek olmayacak bir kod bloğu veya boru operatörü içine yuvalanmış işlevleri içeren zorunda:

quote(sample(c(1:10,-99),6,rep=TRUE)) %>% { 
    replicate(6, eval(.)) } 

Çok ilginç, ama imho Birincisinde gerçekten yararlı değildir ...

+0

Çok teşekkür ederim. Bu çok mantıklı. Sadece bu şeyleri öğrenmeye çalışıyorum. Evet, buradaki boruları kullanmaya değmez ama öğreniyordum. – phage

+0

Sapply gerekli olduğunu sanmıyorum: 'quote (örnek (c (1: 10, -99), 6, rep = DOĞRU))%>% {replicate (6, eval (.))}' – Frank

+1

@Frank Önceki yorumumu unuttum, '{}' özledim ve 'status()' şimdi 'replicate' içinde iç içe. Bu gerçekten çalışıyor, ama bu yarım boru, yarısı değil, bu yüzden daha az mantıklı. Yine de bahsettiğin için teşekkür ederim, bu ilginç bir durum. Ve bu boru operatörünün neden bir solucan konservesi olduğuna dair bir başka örnek açmak istemiyorum. Teklifinizi postaya ekledim. –