diff --git a/r/src/compute.cpp b/r/src/compute.cpp index 446e011f548..5e543b88534 100644 --- a/r/src/compute.cpp +++ b/r/src/compute.cpp @@ -398,6 +398,21 @@ std::shared_ptr make_compute_options( return out; } + if (func_name == "mode") { + using Options = arrow::compute::ModeOptions; + auto out = std::make_shared(Options::Defaults()); + if (!Rf_isNull(options["n"])) { + out->n = cpp11::as_cpp(options["n"]); + } + if (!Rf_isNull(options["min_count"])) { + out->min_count = cpp11::as_cpp(options["min_count"]); + } + if (!Rf_isNull(options["skip_nulls"])) { + out->skip_nulls = cpp11::as_cpp(options["skip_nulls"]); + } + return out; + } + return nullptr; } diff --git a/r/tests/testthat/test-compute-no-bindings.R b/r/tests/testthat/test-compute-no-bindings.R index 33b97e8ed76..c7db1951343 100644 --- a/r/tests/testthat/test-compute-no-bindings.R +++ b/r/tests/testthat/test-compute-no-bindings.R @@ -17,37 +17,81 @@ test_that("non-bound compute kernels using TrimOptions", { expect_equal( - call_function("utf8_trim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "utf8_trim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("racadabr") ) expect_equal( - call_function("utf8_ltrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "utf8_ltrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("racadabra") ) expect_equal( - call_function("utf8_rtrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "utf8_rtrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("abracadabr") ) expect_equal( - call_function("utf8_rtrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "utf8_rtrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("abracadabr") ) expect_equal( - call_function("ascii_ltrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "ascii_ltrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("racadabra") ) expect_equal( - call_function("ascii_rtrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "ascii_rtrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("abracadabr") ) expect_equal( - call_function("ascii_rtrim", Scalar$create("abracadabra"), options = list(characters = "ab")), + call_function( + "ascii_rtrim", + Scalar$create("abracadabra"), + options = list(characters = "ab") + ), Scalar$create("abracadabr") ) }) + +test_that("non-bound compute kernels using ModeOptions", { + expect_equal( + as.vector( + call_function("mode", Array$create(c(1:10, 10, 9, NA)), options = list(n = 3)) + ), + tibble::tibble("mode" = c(9, 10, 1), "count" = c(2L, 2L, 1L)) + ) + + expect_equal( + as.vector( + call_function("mode", Array$create(c(1:10, 10, 9, NA)), options = list(n = 3, skip_nulls = FALSE)) + ), + tibble::tibble("mode" = numeric(), "count" = integer()) + ) +})