2016-09-21 10 views
7

जैसा कि हम जानते हैं, पर्यावरण में उन्हें निर्दिष्ट किए बिना आर में कार्यों को कॉल करना संभव है, उदा।mutate_each (और summarise_each) के लिए अनाम फ़ंक्शंस का उपयोग कैसे करें?

> (function(x){x/2})(5) 
[1] 2.5 

मैं, मक्खी पर इस तरह के कार्यों का उपयोग करने के लिए, एक mutate_each (या summarise_each) कॉल में करना चाहते हैं। उदाहरण के लिए,

df <- data.frame(a = runif(10), b = rnorm(10))

साथ मैं निम्न में से एक करने के लिए प्रयास कर सकते हैं, लेकिन वे सभी वापसी त्रुटियों:

library(dplyr) 

> df %>% 
+  mutate_each(funs((function(x){x/2})), a, b) 
Error in eval(substitute(expr), envir, enclos) : 
    Unsupported type CLOSXP for column "a" 
> 
> df %>% 
+  mutate_each(list((function(x){x/2})), a, b) 
Error: is.fun_list(calls) is not TRUE 
> 
> 
> df %>% 
+  mutate_each(funs((function(x){x/2})(.)), a, b) 
Error in vapply(dots[missing_names], function(x) make_name(x$expr), character(1)) : 
    values must be length 1, 
but FUN(X[[1]]) result is length 2 
> 

हालांकि, अगर मैं कार्यस्थान में समारोह दें और इसके बाद सभी काम करता है अपेक्षा के अनुरूप:

tmp_fn <- function(x){x/2} 

और

> df %>% 
+  mutate_each(funs(tmp_fn), a, b) 
      a   b 
1 0.360048105 -0.452285314 
2 0.020175136 0.253063103 
3 0.002351454 -0.148997643 
4 0.262808493 -0.599555244 
5 0.057246370 0.007567076 
6 0.400027700 0.264901865 
7 0.120505411 -0.346171709 
8 0.266166200 0.116066231 
9 0.031302148 -0.129739601 
10 0.250212897 0.230194217 

क्या कॉल में mutate_each या summarise_each पर कॉल को गतिशील रूप से परिभाषित करने का कोई तरीका है?

+0

उन 'अनाम प्रक्रियाएं' कहा जाता है के साथ समारोह कॉल लपेट कर सकते हैं; यह निहित है कि उन्हें गतिशील रूप से घोषित किया जाना चाहिए। – smci

उत्तर

5

हम कोष्ठकों

df %>% 
    mutate_each(funs(((function(x){x/2})(.)))) 
+2

धन्यवाद। यहां, मैंने सोचा कि मैंने पहले से ही पर्याप्त ब्रांड्स का उपयोग किया था! – Alex

+0

क्या आप जानते हैं कि अतिरिक्त कोष्ठक क्यों आवश्यक है? – Alex

+0

आह, इसे नामकरण कॉलम के साथ कुछ करना है। स्पष्ट रूप से कार्यों के नाम देने से समस्या हल हो जाती है! 'df%>% mutate_each (funs (by_2 = (function (x) {x/2}) (।)), ए, बी)' – Alex

संबंधित मुद्दे