dplyr的函数,其参数默认为“。”

时间:2018-03-22 12:35:42

标签: r dplyr nse

假设我想将tibble中的所有列相加以创建一个名为“total”的新列。我能做到:

myfun <- function(Df){
  apply(Df, 1, sum)
}

# Works fine
Df %>% mutate(total = myfun(.))

我可以像这样制作一个辅助函数,

myfun

但是,假设这个dplyr通常会以这种方式使用,即在myfun动词函数中,然后是“。”。引用数据框是多余的,如果myfun2 <- function(Df=.){ apply(Df, 1, sum) } 函数可以用默认值替换它,那就太好了。我想要这样的事情:

Df %>% mutate(total = myfun2())
Error in mutate_impl(.data, dots) : 
 Evaluation error: object '.' not found.

哪个不起作用。

Df

因为我甚至不确定“。”工作,我不认为我可以更好地表达问题,但基本上,我想知道是否有一种说法,实际上,如果myfun2中没有定义<script> $(document).ready(function() { var max_fields = 10; //maximum input boxes allowed var wrapper = $(".input_fields_wrap"); //Fields wrapper var add_button = $(".add_field_button"); //Add button ID var x = 1; //initlal text box count $(add_button).click(function(e){ //on add input button click e.preventDefault(); if(x < max_fields){ //max input box allowed x++; //text box increment $(wrapper).append('<div><input type="text" name="parameter_value" size="50" style="width: 50%;; margin-left: 3%;" class="headers " value="${workflow.parameter_value}" />&nbsp;&nbsp;&nbsp;<a href="#" class="remove_field bttn">Remove</a></div>'); //add input box } }); $(wrapper).on("click",".remove_field", function(e){ //user click on remove text e.preventDefault(); $(this).parent('div').remove(); x--; }); }); </script> <table> <tr> <td class="tbody_color"> <div class="input_fields_wrap"> <c:if test="${not empty workflow.workflowParametersList}"> <c:forEach var="paramValue" items="${workflow.workflowParametersList}"> <input type="text" name="parameter_value" size="50" style="width: 50%;; margin-left: 13%;" class="headers" value="${paramValue.param_value}"></input> &nbsp;&nbsp;<button class="add_field_button bttn">Add Parameters</button> </c:forEach> </c:if> <c:if test="${empty workflow.workflowParametersList}"> <input type="text" name="parameter_value" size="50" style="width: 50%;; margin-left: 13%;" class="headers" value=""></input> &nbsp;&nbsp;<button class="add_field_button bttn">Add Parameters</button> </c:if> </div> </td> </tr> </table> ,请获取数据框通常由“。”引用?

1 个答案:

答案 0 :(得分:3)

一个选项是quote该功能,然后使用!!

进行评估
library(tidyverse)
myfun <- function() {
   quote(reduce(., `+`))
}

r1 <- Df %>% 
          mutate(total = !! myfun())
r1
# A tibble: 10 x 5
#       p_1    p_2    q_1     q_2  total
#     <dbl>  <dbl>  <dbl>   <dbl>  <dbl>
# 1  1.37    1.30  -0.307  0.455   2.82 
# 2 -0.565   2.29  -1.78   0.705   0.645
# 3  0.363  -1.39  -0.172  1.04   -0.163
# 4  0.633  -0.279  1.21  -0.609   0.960
# 5  0.404  -0.133  1.90   0.505   2.67 
# 6 -0.106   0.636 -0.430 -1.72   -1.62 
# 7  1.51   -0.284 -0.257 -0.784   0.186
# 8 -0.0947 -2.66  -1.76  -0.851  -5.37 
# 9  2.02   -2.44   0.460 -2.41   -2.38 
#10 -0.0627  1.32  -0.640  0.0361  0.654

请注意,reduce曾与tidyverse更加一致,但OP的功能也可以引用并获得相同的结果

myfun2 <- function() {
   quote(apply(., 1,  sum ))
}

r2 <- Df %>%
        mutate(total = !! myfun2())
all.equal(r2$total, r1$total)
#[1] TRUE