2017-08-02 8 views
0

「実行」やデータの欠落数を計算する関数を作成しています - これをdplyr::group_byと併用したいので、これをS3メソッドとして記述しました。このコードの簡単な例。tidyevalでmap2を引用符で囲まずに

残念ながら、引用符で囲まれていない変数名は機能しませんが、これを引用すると、これは不思議なことです。以下は

あなたの第二の入力(varが)最初の入力(dataグループ化/ネストされた)と一緒に変更されていないので、あなたが実際に、map2を使用しない出力

fun_run <- function(data, var) { 

    UseMethod("fun_run") 

    } 

fun_run.default <- function(data, var) { 

    var <- rlang::enquo(var) 

    data_pull <- data %>% dplyr::pull(!(!var)) 

    # find the lengths of the number of missings in a row 
    tibble::as_tibble(c(rle(is.na(data_pull)))) 

} 

fun_run.grouped_df <- function(data, var) { 

    var <- rlang::enquo(var) 

    tidyr::nest(data) %>% dplyr::mutate(data = purrr::map2(.x = data, .y = !(!var), 
                 .f = fun_run)) %>% tidyr::unnest() 

} 

library(dplyr) 
#> 
#> Attaching package: 'dplyr' 
#> The following objects are masked from 'package:stats': 
#> 
#>  filter, lag 
#> The following objects are masked from 'package:base': 
#> 
#>  intersect, setdiff, setequal, union 

airquality %>% fun_run(Ozone) 
#> # A tibble: 35 x 2 
#> lengths values 
#> <int> <lgl> 
#> 4 FALSE 
#> 1  TRUE 
#> 4 FALSE 
#> 1  TRUE 
#> 14 FALSE 
#> 3  TRUE 
#> 4 FALSE 
#> 6  TRUE 
#> 1 FALSE 
#> 1  TRUE 
#> ... with 25 more rows 

# doesn't work 
airquality %>% group_by(Month) %>% fun_run(Ozone) 
#> Error in mutate_impl(.data, dots) : Evaluation error: object 'Ozone' not found. 

# does work 
airquality %>% group_by(Month) %>% fun_run("Ozone") 
#> # A tibble: 37 x 3 
#> Month lengths values 
#> <int> <int> <lgl> 
#>  5  4 FALSE 
#>  5  1 TRUE 
#>  5  4 FALSE 
#>  5  1 TRUE 
#>  5  14 FALSE 
#>  5  3 TRUE 
#>  5  4 FALSE 
#>  6  6 TRUE 
#>  6  1 FALSE 
#>  6  1 TRUE 
#> # ... with 27 more rows 

答えて

2

と例です。 。さらに、「オゾン」列はその時点でネストされたデータに隠されています。あなたはどのtidyeval構文なしでコードを実行しようとすることで、これを見ることができます:

代わり
data <- airquality %>% group_by(Month) 
tidyr::nest(data) %>% dplyr::mutate(data = purrr::map2(.x = data, .y = Ozone, 
                 .f = fun_run)) %>% tidyr::unnest() 
#>Error in mutate_impl(.data, dots) : 
#> Evaluation error: object 'Ozone' not found. 

、あなたが標準mapを使用したい:一度あなたの関数で使用するために書き直さ

tidyr::nest(data) %>% dplyr::mutate(data = purrr::map(.x = data, var = Ozone, 
                 .f = fun_run)) %>% tidyr::unnest() 

fun_run.grouped_df <- function(data, var) { 

    var <- rlang::enquo(var) 

    tidyr::nest(data) %>% dplyr::mutate(data = purrr::map(.x = data, var = !!var, 
                 .f = fun_run)) %>% tidyr::unnest() 

} 

最終的に引用された例の結果が表示されます。

+0

Ah!これはまさに私が望むものを生み出します。 完璧、ありがとう!私はネストされたデータフレームについて考えすぎるほど、複雑なものを作りました。 –

関連する問題