vctrs - incompatible types.

## R version 4.0.5.
## latest 'tidyverse' package.
library('dplyr')
library('tibble')

df <- data.frame(x = letters[1:3],
                 y = c(52, 35, 5))

### Code adds a new row to df with the value 100 - (52 + 35 + 5).

### Code below works. In order to make it work, I had
### to 'deframe' df.
df1 <- df %>%
  add_row(x = "d",
          y = 100 - deframe(summarise(., across(where(is.numeric), sum)
          )))

### Code below used to work before installing the latest
### 'tidyverse' package.  No 'deframe' was necessary.  See error message below.
df2 <- df %>%
  add_row(x = "d",
                      y = 100 - summarise_if(., is.numeric, sum))

### Error: Can't combine `..1$y` <double> and `..2$y` <data.frame>.

# Run `rlang::last_error()` to see where the error occurred.
# > rlang::last_error()
# <error/vctrs_error_incompatible_type>
# Can't combine `..1$y` <double> and `..2$y` <data.frame>.
# Backtrace:
#   1. `%>%`(...)
# 2. tibble::add_row(...)
# 3. tibble:::rbind_at(.data, df, pos)
# 4. vctrs::vec_rbind(old, new)
# 6. vctrs::vec_default_ptype2(...)
# 7. vctrs::stop_incompatible_type(...)
# 8. vctrs:::stop_incompatible(...)
# 9. vctrs:::stop_vctrs(...)

I think your fix and the error are correct. vctrs is checking for rows that shouldn't be bound because they are of two different types, one a double, and the other a data frame. Is the issue that you think the latter is not a data frame, and thus it's an error?

If so, you might want to file an issue in vctrs.

Thanks, Mara for your prompt answer.

Yes, I think in the example I gave, the issue is that the latter shall not be a data frame. If I sum over one numeric vector, should the result be a double instead?

In fact, I sent this ticket because my code broke after installing R 4.0.5 (from R 3.6.1) and the latest Tidyverse packages.

The lines below used to work:
df2 <- df %>%
add_row(x = "d",
y = 100 - summarise_if(., is.numeric, sum))

I fixed the code (and used the new function 'across'):
df1 <- df %>%
add_row(x = "d",
y = 100 - deframe(summarise(., across(where(is.numeric), sum)
)))

Frédéric.

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.