2017-03-09 1 views
1

저는 인자를 매개 변수로 전달하여 다른 함수를 감싸려고하는 함수가 있습니다. ... 매개 변수입니다. 나는이에도트 매개 변수의 비표준 평가

library(dplyr) 

pythag <- function(a, b){ 
    sqrt(a^2 + b^2) 
} 
pythag_wrapper <- function(data, ...){ 
    dplyr::mutate_(data, 
    root = lazyeval::interp(~pythag(x), x = ...) 
) 
} 

, lazyeval 여기 괜찮은 MWE의 기본으로되는 함수 호출을 구성하는 방법을 학습하는 데 문제가 내 pythag_wrapper 일부 추가 데이터 munging 할 것입니다. 내 경우에는 pythag에 두 개 이상의 인수가 있습니다. 이 함수는 잘 작동하고 의도 한대로 작동합니다.

test_data <- dplyr::data_frame(a = runif(10), b = runif(10), c = runif(10)) 

test_data %>% 
    dplyr::mutate(
    root = pythag(a = b, b = c) 
) 
## # A tibble: 10 × 4 
##    a   b   c  root 
##   <dbl>  <dbl>  <dbl>  <dbl> 
## 1 0.19805337 0.05567241 0.9956758 0.9972311 
## 2 0.22642799 0.18871552 0.8690659 0.8893195 
## 3 0.09352032 0.57328658 0.7475573 0.9420719 
## 4 0.40589832 0.71270806 0.8014196 1.0724860 
## 5 0.35896302 0.85889027 0.8197176 1.1872782 
## 6 0.66409819 0.02206298 0.1304790 0.1323312 
## 7 0.45102742 0.76048535 0.5501899 0.9386410 
## 8 0.48249177 0.93670363 0.8280114 1.2502066 
## 9 0.05545819 0.12281684 0.9219704 0.9301148 
## 10 0.47588862 0.40196106 0.0192433 0.4024214 

나는 등 lazyeval::interp, lazy_eval::lazy_dots의 모든 종류의 조합을 시도했다, 그러나 나는 정확히, 내 문제를 해결하는 방법을 훨씬 덜 발생하도록되어 무엇인지 이해할 수 없습니다.

pythag_wrapper(test_data, a = "a", b = "b") 

## Error: object 'x' not found 

답변

1

코드의 문제는 dots 인수 ...을 처리하는 방법에 있습니다.

pythag_wrapper <- function(data, ...){ 
    # From ... argument get names and values 
    dots = list(...) 

    # 'Write' the formula: ' ~ pythag(a = val1, b = val2)' 
    yourformula = as.formula(
     paste0(" ~ pythag(", 
     paste0(names(dots), " = ", unlist(dots), collapse = ", "), 
     ")") 
     ) 

    # Apply the mutate_. The setNames here is what you need to 
     # apply the right name to the resulting column 
    dplyr::mutate_(data, .dots = setNames(list(yourformula), 'root')) 
} 
+0

이 나에게 조금 더를 얻을 수 (그리고 MWE를 해결),하지만 내 실제 사건이 UseMethod에서'오류를 반환

는 약간 잘 작동 코드와 '수동'래퍼 내부의 공식을 다시 작성 변경 ("as.lazy_dots") : 'as.lazy_dots'에 적용 할 수있는 메소드가 "function"클래스의 객체에 적용되지 않았습니다. 이는 여전히 무난합니다. – gregmacfarlane

+0

그리고 왜 함수 호출을 다시 작성하려고했는지 설명 할 수 있습니까? 이런 종류의 문제를 해결하는 가장 깨끗한 방법입니까? – gregmacfarlane