R/relocate.R

Defines functions duckplyr_relocate relocate.duckplyr_df

Documented in relocate.duckplyr_df

# Generated by 02-duckplyr_df-methods.R
#' @rdname relocate.duckplyr_df
#' @export
relocate.duckplyr_df <- function(.data, ..., .before = NULL, .after = NULL) {
  loc <- eval_relocate(
    expr = expr(c(...)),
    data = .data,
    before = enquo(.before),
    after = enquo(.after),
    before_arg = ".before",
    after_arg = ".after"
  )

  exprs <- exprs_from_loc(.data, loc)

  # Ensure `relocate()` appears in call stack
  duckplyr_error <- rel_try(list(name = "relocate", x = .data, args = try_list(dots = enquos(...), .before = enquo(.before), .after = enquo(.after))),
    #' @section Fallbacks:
    #' There is no DuckDB translation in `relocate.duckplyr_df()`
    #' - with a selection that returns no columns.
    #'
    #' These features fall back to [dplyr::relocate()], see `vignette("fallback")` for details.
    "Zero-column result set not supported." = (length(exprs) == 0),
    {
      rel <- duckdb_rel_from_df(.data)
      out <- exprs_project(rel, exprs, .data)
      return(out)
    }
  )

  # dplyr forward
  check_prudence(.data, duckplyr_error)

  relocate <- dplyr$relocate.data.frame
  out <- relocate(.data, ..., .before = {{ .before }}, .after = {{ .after }})
  return(out)

  # dplyr implementation
  loc <- eval_relocate(
    expr = expr(c(...)),
    data = .data,
    before = enquo(.before),
    after = enquo(.after),
    before_arg = ".before",
    after_arg = ".after"
  )

  out <- dplyr_col_select(.data, loc)
  out <- set_names(out, names(loc))

  out
}

duckplyr_relocate <- function(.data, ...) {
  try_fetch(
    .data <- as_duckplyr_df_impl(.data),
    error = function(e) {
      testthat::skip(conditionMessage(e))
    }
  )
  out <- relocate(.data, ...)
  class(out) <- setdiff(class(out), "duckplyr_df")
  out
}

Try the duckplyr package in your browser

Any scripts or data that you put into this service are public.

duckplyr documentation built on June 8, 2025, 10:53 a.m.