Получение аргументов функции r из функции Rcpp c ++ - PullRequest
1 голос
/ 03 апреля 2019

Я определил функцию на стороне R следующим образом:

foo <- function(arg1, arg2, arg3) {
    ...
}

и функция в c ++, использующая Rcpp, которая получает глобальную среду и создает экземпляр функции R для ее выполнения из этой функции. Вот код:

namespace Rcpp;
void myFunction() {
    ...
    Environment env = Environment::global_env();
    Function funct = env["foo"];
    ...
}

Работает нормально, но я хотел бы проверить, что функция R имеет ровно 3 аргумента. Как я могу получить количество аргументов функции R в методе c ++?

1 Ответ

3 голосов
/ 03 апреля 2019

Вы можете использовать макрос доступа замыкания FORMALS и функцию-член PreserveStorage get__() (Rcpp::Function является производным классом Rcpp::PreserveStorage), чтобы получитьформальные, затем получить его количество элементов:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int n_formals() {
    Environment env = Environment::global_env();
    Function funct = env["foo"];
    SEXP sexp_funct = funct.get__();
    SEXP funct_formals = FORMALS(sexp_funct);
    return Rf_length(funct_formals);
}


/*** R
foo <- function(x, y) x + y
n_formals()
foo <- function(x, y, z) x + y + z
n_formals()
*/

# > foo <- function(x, y) x + y
# 
# > n_formals()
# [1] 2
# 
# > foo <- function(x, y, z) x + y + z
# 
# > n_formals()
# [1] 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...