tests/testthat/test-f_mutate.R

cheapr::with_local_seed(
  {
    df <- new_tbl(
      x = rnorm(25),
      y = round(x, 2) + 0,
      g = sample.int(3, 25, TRUE)
    )
  }, 42
)

test_that("mutate", {

  # New variables
    expect_equal(
      df |>
        f_mutate(z = x),
      df |>
        dplyr::mutate(z = x)
    )

    expect_equal(
      df |>
        f_mutate(z = 0L),
      df |>
        dplyr::mutate(z = 0L)
    )

    expect_equal(
      df |>
        f_mutate(a = x, b = 0L, c = mean(x)),
      df |>
        dplyr::mutate(a = x, b = 0L, c = mean(x))
    )

    # Replacing variable
    expect_equal(
      df |>
        f_mutate(y = x),
      df |>
        dplyr::mutate(y = x)
    )

    expect_equal(
      df |>
        f_mutate(y = x, x = y),
      df |>
        dplyr::mutate(y = x, x = y)
    )

    # Using .data and .env

    x <- seq_len(nrow(df))

    expect_equal(
      df |>
        f_mutate(new1 = x, new2 = .data$x, new3 = .env$x),
      df |>
        dplyr::mutate(new1 = x, new2 = .data$x, new3 = .env$x)
    )

    expect_equal(
      df |>
        f_mutate(new1 = 0L) |>
        f_mutate(new2 = .data$new1),
      df |>
        dplyr::mutate(new1 = 0L, new2 = .data$new1)
    )

    a <- 1:nrow(df)

    expect_equal(
      df |>
        f_mutate(a = 0L) |>
        f_mutate(b = .data$a, c = .env$a),
      df |>
        dplyr::mutate(a = 0L, b = .data$a, c = .env$a)
    )

    expect_equal(
      df |> f_mutate(new1 = mean(x), new2 = sum(x), n = n(), .by = g),
      df |> dplyr::mutate(new1 = mean(x), new2 = sum(x), n = n(), .by = g)
    )

    expect_equal(
      df |> f_mutate(new1 = mean(x), new2 = sum(x), n = n(), new3 = identity(y), new4 = x + y, .by = g),
      df |> dplyr::mutate(new1 = mean(x), new2 = sum(x), n = n(), new3 = identity(y), new4 = x + y, .by = g)
    )

    # Verify that optimisations work for complex group-unaware exprs
    options(fastplyr.inform = TRUE)
    expect_message(df |> f_mutate(new1 = round(identity(y) + .data$x), new2 = (\(x) 0L)()))
    options(fastplyr.inform = FALSE)

    expect_equal(
      df |> f_mutate(new1 = round(identity(y) + .data$x - abs(y)), .by = g),
      df |> dplyr::mutate(new1 = round(identity(y) + .data$x - abs(y)), .by = g)
    )

    # Make sure that the correct variables are being used

})



test_that("mutate + across", {

  expect_equal(
    df |>
      f_mutate(across(x, sum)),
    df |>
      dplyr::mutate(across(x, sum))
  )

  expect_equal(
    df |>
      f_mutate(across(x, list(sum = sum), .names = "{.col}")),
    df |>
      dplyr::mutate(across(x, list(sum = sum), .names = "{.col}"))
  )

  expect_equal(
    df |>
      f_mutate(across(1:2, list(sum = sum), .names = "{.col}")),
    df |>
      dplyr::mutate(across(1:2, list(sum = sum), .names = "{.col}"))
  )

  expect_equal(
    df |>
      f_mutate(across(1:2, list_tidy(sum, .named = TRUE), .names = "{.col}")),
    df |>
      dplyr::mutate(across(1:2, list_tidy(sum, .named = TRUE), .names = "{.col}"))
  )

  expect_equal(
    df |>
      f_mutate(across(1:2, list_tidy(sum, mean, .named = TRUE), .names = "{.col}_fn_{.fn}")),
    df |>
      dplyr::mutate(across(1:2, list_tidy(sum, mean, .named = TRUE), .names = "{.col}_fn_{.fn}"))
  )

  expect_equal(
    df |>
      f_mutate(
        across(
          1:2, list_tidy(sum, mean, .named = TRUE),
          .names = "{.col}_fn_{.fn}"
        ), .by = g
      ),
    df |>
      dplyr::mutate(
        across(
          1:2, list_tidy(sum, mean, .named = TRUE), .names = "{.col}_fn_{.fn}"
        ), .by = g
      )
  )

  # .unpack
  expect_equal(
    df |>
      f_mutate(across(1:2, \(x) new_tbl(new1 = x, new2 = mean(x)), .unpack = FALSE)),
    df |>
      dplyr::mutate(across(1:2, \(x) new_tbl(new1 = x, new2 = mean(x)), .unpack = FALSE))
  )

  expect_equal(
    df |>
      f_mutate(across(1:2, \(x) new_tbl(new1 = x, new2 = mean(x)), .unpack = TRUE)),
    df |>
      dplyr::mutate(across(1:2, \(x) new_tbl(new1 = x, new2 = mean(x)), .unpack = TRUE))
  )

})


test_that("more tests", {


  # Removing variables

  expect_equal(
    df |> f_mutate(across(everything(), \(x) NULL)),
    f_select(df, nothing())
  )

  options(fastplyr.optimise = FALSE)
  expect_error(df |> f_mutate(y = NULL, new = y))
  options(fastplyr.optimise = TRUE)

  # Using .data[[

  ok <- "x"
  expect_equal(
    df |>
      f_mutate(
        new1 = sum(.data[["x"]]),
        new2 = sum(.data[[ok]]),
        new3 = sum(.data[[unique(c(ok, "x"))]])
      ),
    df |>
      dplyr::mutate(
        new1 = sum(.data[["x"]]),
        new2 = sum(.data[[ok]]),
        new3 = sum(.data[[unique(c(ok, "x"))]])
      )
  )
})

Try the fastplyr package in your browser

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

fastplyr documentation built on Nov. 21, 2025, 5:07 p.m.