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
df <- tibble(x = 1:3)
# Why doesn't this recycle to size 0?
summarise(df, sum = sum(x), empty = tibble())
#> Error in `dplyr_col_modify()`:
#> ! Can't recycle `empty` (size 0) to size 1.
#> Backtrace:
#> ▆
#> 1. ├─dplyr::summarise(df, sum = sum(x), empty = tibble())
#> 2. ├─dplyr:::summarise.data.frame(df, sum = sum(x), empty = tibble())
#> 3. │ └─dplyr:::summarise_build(.data, cols)
#> 4. │ ├─dplyr::dplyr_col_modify(out, cols$new)
#> 5. │ └─dplyr:::dplyr_col_modify.data.frame(out, cols$new)
#> 6. │ └─vctrs::vec_recycle_common(!!!cols, .size = nrow(data))
#> 7. └─vctrs:::stop_recycle_incompatible_size(...)
#> 8. └─vctrs:::stop_vctrs(...)
#> 9. └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))
# This does
summarise(df, sum = sum(x), empty = tibble(a = integer()))
#> # A tibble: 0 × 2
#> # … with 2 variables: sum <int>, empty <tibble[,1]>
# And these work
summarise(df, sum = sum(x), tibble())
#> # A tibble: 1 × 1
#> sum
#> <int>
#> 1 6
summarise(df, sum = sum(x), tibble(a = integer()))
#> # A tibble: 0 × 2
#> # … with 2 variables: sum <int>, a <int>
Created on 2022-10-18 with reprex v2.0.2.9000
Created on 2022-10-18 with reprex v2.0.2.9000