2017-10-29 58 views
5

kullanarak toplamak operatör quosure için - ekler ve bu gather için, şöyle geçer:- Bir bağımsız değişken olarak bir quosure alan bir fonksiyon, yazmak istiyorum standart olmayan değerlendirme

library(tidyverse) 
my_gather <- function(d, not.columns) { 
    dg <- tidyr::gather(d, key = k, value = v, .dots = -!!!not.columns) 
    dg 
} 

de <- my_gather(mtcars, not.columns = quos(mpg, cyl, disp)) 

> Error in `-`(~mpg, ~cyl, ~disp) : operator needs one or two arguments 

Bu Açıktır ki, - ile tüm kaplamayı eklemek yerine, - ile kaplamanın her bir öğesini eklemeye ihtiyacım var. Ama benim işimde, quos(-mpg, -cyl, -disp) biçiminde bu pozlamayı oluşturmak kolay olmayacak -eklemek için quos(mpg, cyl, disp)'u nasıl değiştirebilirim?

ben, ilk 3 sıra bunların,

mpg cyl disp k v 
1 21.0 6 160 hp 110 
2 21.0 6 160 hp 110 
3 22.8 4 108 hp 93 

benzer soru here var olan gather(mtcars, key = k, value = v, -mpg, -cyl, -disp) aynı olan bir sonucunu görmek istiyorum ama cevapsız ve başa görünmüyor quo() yerine quos() sayılı belge.

+0

Can bir sonucu olarak görmeyi umduğunuz şeyleri daha ayrıntılı olarak tanımlarsınız bu? –

+0

@ 42-: düzenlemeye bakın. –

cevap

3

Biz

my_gather <- function(d, not.columns) { 
    tidyr::gather(d, key = k, value = v, .dots = -c(UQS(not.columns))) 
    #or use !!! instead of UQS 
    #tidyr::gather(d, key = k, value = v, .dots = -c(!!!(not.columns))) 

} 
de <- my_gather(mtcars, not.columns = quos(mpg, cyl, disp)) 
head(de, 3) 
# mpg cyl disp k v 
#1 21.0 6 160 hp 110 
#2 21.0 6 160 hp 110 
#3 22.8 4 108 hp 93 

fonksiyonu olmadan çıkışı ile kontrol edilmesi yapabilirsiniz

de1 <- gather(mtcars, key = k, value = v, -mpg, -cyl, -disp) 
identical(de, de1) 
#[1] TRUE 
+0

Bu, OP’in denemesinden nasıl farklıdır? UQS = '!!!'; 'c' burada bir fark yaratmamalı. –

+2

@KonradRudolph Evet, 'c' farktır, Ama ben – akrun

+0

köşebentleri içine yerleştirmeyi seviyorum. Nedenini açıklayan akıl mı? Çok belirgin değil –

2

"Sorunu değil, sorunun cevabını" yanıtlayabilirsiniz. Kullanılmayan sütunlar hakkında bilgi sahibi olan toplanmış sütunları belirtmenin bir yoluna ihtiyacınız var.

library(tidyverse) 

negate_columns <- function(.tbl, not.columns) { 
    not_columns <- colnames(select(.tbl, !!!not.columns)) 

    setdiff(colnames(.tbl), not_columns) 
} 

my_gather <- function(d, not.columns) { 
    columns <- negate_columns(d, not.columns) 

    tidyr::gather(d, key = k, value = v, !!!syms(columns)) 
} 

beklendiği gibi çalışır Bu şekilde: İşte benim yolum

my_gather(mtcars, not.columns = quos(mpg, cyl, disp)) %>% 
    head(3) 
#> mpg cyl disp k v 
#> 1 21.0 6 160 hp 110 
#> 2 21.0 6 160 hp 110 
#> 3 22.8 4 108 hp 93 
İlgili konular