Exemple #1
0
SEXP c_which_last(SEXP x, SEXP use_names) {
    if (!isLogical(x))
        error("Argument 'x' must be logical");
    if (!isLogical(use_names) || length(use_names) != 1)
        error("Argument 'use.names' must be a flag");
    int *xp = LOGICAL(x);

    for (R_len_t i = length(x) - 1; i >= 0; i--) {
        if (xp[i] != NA_LOGICAL && xp[i]) {
            if (LOGICAL(use_names)[0])
                return named_return(i, GET_NAMES(x));
            else
                return ScalarInteger(i+1);
        }
    }
    return allocVector(INTSXP, 0);
}
Exemple #2
0
SEXP c_which_first(SEXP x, SEXP use_names) {
    if (!isLogical(x))
        error("Argument 'x' must be logical");
    if (!isLogical(use_names) || length(use_names) != 1)
        error("Argument 'use.names' must be a flag");
    const R_len_t n = length(x);
    int *xp = LOGICAL(x);

    for (R_len_t i = 0; i < n; i++) {
        if (xp[i] != NA_LOGICAL && xp[i]) {
            if (LOGICAL(use_names)[0])
                return named_return(i, getAttrib(x, R_NamesSymbol));
            else
                return ScalarInteger(i+1);
        }
    }
    return allocVector(INTSXP, 0);
}