Почему мне иногда приходится заключать `.` в` data.frame() `для именованного аргумента в` do`?

Почему это не работает?

data.frame(x = rnorm(100)) %>% do(df = .)

Сообщение об ошибке:

Error in do_(.data, .dots = lazyeval::lazy_dots(...)) :
  argument ".data" is missing, with no default

Вместо этого я должен заключить . в data.frame():

data.frame(x = rnorm(100)) %>% do(df = data.frame(.))

В качестве альтернативы это также работает:

data.frame(x = rnorm(100)) %>% do(., df = .)

Пример, конечно, не имеет смысла. Но при работе с group_by может быть полезно сохранить data.frame в качестве переменной списка.

Вот более сложная проблема, которая, по-видимому, связана:

library("MatchIt")
n <- 5000
DF <- data.frame(
    x1 = rnorm(n),
    x2 = rbinom(n, 1, 0.5),
    group = rbinom(n, 1, 0.5),
    D = rbinom(n, 1, 0.5)) 

Теперь это вызывает ошибку:

DF %>%
    group_by(group) %>%
    do(m = matchit(D ~ x1, data = ., exact = "x2"))

Но он работает, когда я заключу . в data.frame():

DF %>%
    group_by(group) %>%
    do(m = matchit(D ~ x1, data = data.frame(.), exact = "x2"))

Я не уверен, связан ли второй пример с matchit, но в обоих случаях я должен заключить . в data.frame().

sessionInfo()

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] MatchIt_2.4-21 MASS_7.3-33    dplyr_0.4.1    Defaults_1.1-1

loaded via a namespace (and not attached):
[1] assertthat_0.1  DBI_0.3.1       lazyeval_0.1.10 magrittr_1.5    parallel_3.1.1  Rcpp_0.11.4     tools_3.1.1

Ответ 1

Разница исходит из способа расщепления цепей magrittr.

expr1 <- substitute(data.frame(x = rnorm(100)) %>% do(df = .))
expr2 <- substitute(data.frame(x = rnorm(100)) %>% do(df = (.)))

magrittr:::split_chain(expr1)
magrittr:::split_chain(expr2)