romainfrancois commented on a change in pull request #10730:
URL: https://github.com/apache/arrow/pull/10730#discussion_r672308568
##########
File path: r/src/altrep.cpp
##########
@@ -104,63 +143,138 @@ struct ArrayNoNull {
return const_cast<void*>(Dataptr_or_null(vec));
}
- // by definition, there are no NA
- static int No_NA(SEXP vec) { return 1; }
+ static int No_NA(SEXP vec) { return Get(vec)->null_count() == 0; }
+
+ static SEXP Min(SEXP x, Rboolean narm) { return MinMax(x, narm, "min",
R_PosInf); }
+
+ static SEXP Max(SEXP x, Rboolean narm) { return MinMax(x, narm, "max",
R_NegInf); }
+
+ static SEXP MinMax(SEXP x, Rboolean narm, const std::string& field, double
inf) {
+ const auto& array = Get(x);
+ bool na_rm = narm == TRUE;
+ auto n = array->length();
+ auto null_count = array->null_count();
+ if ((na_rm || n == 0) && null_count == n) {
+ return Rf_ScalarReal(inf);
+ }
+ if (!na_rm && null_count > 0) {
+ return cpp11::as_sexp(cpp11::na<data_type>());
+ }
+
+ auto options = Options(array, na_rm);
+
+ const auto& minmax =
+ ValueOrStop(arrow::compute::CallFunction("min_max", {array},
options.get()));
+ const auto& minmax_scalar =
+ internal::checked_cast<const StructScalar&>(*minmax.scalar());
+
+ const auto& result_scalar = internal::checked_cast<const scalar_type&>(
+ *ValueOrStop(minmax_scalar.field(field)));
+ return cpp11::as_sexp(result_scalar.value);
+ }
+
+ static SEXP Sum(SEXP x, Rboolean narm) {
+ const auto& array = Get(x);
+ bool na_rm = narm == TRUE;
+ auto null_count = array->null_count();
+
+ if (!na_rm && null_count > 0) {
+ return cpp11::as_sexp(cpp11::na<data_type>());
+ }
+ auto options = Options(array, na_rm);
+
+ const auto& sum =
+ ValueOrStop(arrow::compute::CallFunction("sum", {array},
options.get()));
+
+ if (sexp_type == INTSXP) {
+ // When calling the "sum" function on an int32 array, we get an Int64
scalar
+ // in case of overflow, make it a double like R
+ int64_t value = internal::checked_cast<const
Int64Scalar&>(*sum.scalar()).value;
+ if (value < INT32_MIN || value > INT32_MAX) {
Review comment:
Thanks. R indeed converts to numeric in that case:
``` r
str(sum(as.integer(c(-2^31 + 1L))))
#> int -2147483647
str(sum(as.integer(c(-2^31 + 1L, -1L))))
#> num -2.15e+09
```
<sup>Created on 2021-07-19 by the [reprex
package](https://reprex.tidyverse.org) (v2.0.0)</sup>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]