2017-10-29 25 views
5

का उपयोग कर इकट्ठा के साथ ऑपरेटर मैं एक समारोह है कि एक तर्क के रूप में एक quosure लेता है, लिखने के लिए करना चाहते हैं quosure को - जोड़ देती है, और गुजरता है कि gather है, इसलिए जैसे:- गैर मानक मूल्यांकन

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 

यह स्पष्ट रूप से है क्योंकि मुझे - के साथ संपूर्ण समापन को जोड़ने के बजाय - के साथ क्वार्स के प्रत्येक तत्व को जोड़ने की आवश्यकता है। लेकिन मेरे काम में, quos(-mpg, -cyl, -disp) के रूप में इस quosure को बनाना आसान नहीं होगा - तो - जोड़ने के लिए मैं quos(mpg, cyl, disp) को कैसे संशोधित कर सकता हूं?

मैं एक परिणाम है कि gather(mtcars, key = k, value = v, -mpg, -cyl, -disp) के समान है देखना चाहेंगे, पहले 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 

एक समान प्रश्न here नहीं है, लेकिन यह अनुत्तरित है और से निपटने के लिए प्रतीत नहीं होता quo() के बजाय quos() का मुद्दा।

+0

कर सकते हैं आप अधिक विस्तार से वर्णन करते हैं कि परिणामस्वरूप आप क्या देखने की उम्मीद करते हैं इस? –

+0

@ 42-: संपादन देखें। –

उत्तर

3

हम

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 

समारोह के बिना उत्पादन के साथ जांच की जा रही कर सकते हैं

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

यह ओपी के प्रयास से अलग कैसे है? 'यूक्यूएस' =' !!! '; 'सी' को यहां कोई फर्क नहीं पड़ना चाहिए। –

+2

@ कोनराड रुडॉल्फ हाँ, 'सी' अंतर है, लेकिन, मैं इसे ब्रेसिज़ – akrun

+0

ठीक के अंदर रखना चाहता हूं। मन क्यों समझा रहा है? यह बहुत स्पष्ट नहीं है –

2

मैं जवाब का जवाब "समस्या का जवाब नहीं दे सकता" जवाब दे सकता हूं। आपको कॉल किए गए कॉलम के बारे में जानकारी रखने वाले एकत्रित कॉलम निर्दिष्ट करने के लिए वास्तव में एक तरीका चाहिए।

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)) 
} 

इस तरह यह अपेक्षा के अनुरूप काम करता है:: यहाँ मेरा तरीका है

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 
संबंधित मुद्दे