Ошибка при вызове функции Rcpp из Таблицы. Как интерпретировать и отлаживать логи Rserve?

У меня много проблем с подключением функции R, которую я написал в Tableau. Функция опирается на Rcpp.

В R, если я позвоню prob_1_beats_2(1, 2, 3, 4) это работает просто отлично. Однако, когда я пытаюсь подключиться к Tableau с помощью Rserve, я получаю эту ошибку:

Error in eval(expr, envir, enclos) : expecting a single value

который я не могу отследить. Я попытался запустить Rserve в режиме отладки, но безрезультатно. Я не уверен, как интерпретировать эти результаты. Было бы хорошо проследить, что именно называется в R.

Суть отладочных журналов: https://gist.github.com/FrankPortman/f5cfe32596fd47080286

prob_1_beats_2 <- function(alpha_1, beta_1, alpha_2, beta_2, percent_lift = 0) {

if(alpha_1 / beta_1 < alpha_2 / beta_2) {

t1 <- alpha_2
t2 <- beta_2

alpha_2 <- alpha_1
beta_2 <- beta_1

alpha_1 <- t1
beta_1 <- t2

}

alt_count(alpha_1, beta_1, alpha_2, beta_2)

}

А вот и функция Rcpp:

double alt_count(double alpha_1, double beta_1, double alpha_2, double beta_2) {

double total = 0;

for(int i = 0; i < alpha_1; i++) {

total += exp(i * log(beta_1) + alpha_2 * log(beta_2) - (i + alpha_2) * log(beta_1 + beta_2) - log(i + alpha_2) - lbeta(i + 1, alpha_2));

}

return total;

}

Как вы видете:

> prob_1_beats_2(1, 2, 3, 4)
[1] 0.7037037

Наконец, вызов Tableau, который я использую:

SCRIPT_REAL("library(mypackage);prob_1_beats_2(.arg1, .arg2, .arg3, .arg4)", 1.0, 2.0, 3.0, 4.0)

Обратите внимание, что

SCRIPT_REAL("library(mypackage);prob_1_beats_2(1, 2, 3, 4)", 1.0, 2.0, 3.0, 4.0)

возвращает 0,7037037. Реальный вызов Tableau, который я буду использовать, не будет использовать постоянные значения 1: 4, но я пытаюсь сделать это в целях отладки.

3

Решение

Кажется, что Tableau всегда передавал значения в R как векторы. При наборе текста:

SCRIPT_REAL("library(mypackage);prob_1_beats_2(.arg1, .arg2, .arg3, .arg4)", 1.0, 2.0, 3.0, 4.0)

R на самом деле получал c(1 , 1 , 1 , 1 , etc.), c(2 , 2 , 2 , 2 , 2 , etc.) и так далее в качестве аргументов функции. По какой-то причине это было обработано без компонента Rcpp, но не удалось, когда я переписал функцию, включив в нее Rcpp.

Этот обходной путь, кажется, хорошо сейчас:

prob_1_beats_2 <- function(alpha_1, beta_1, alpha_2, beta_2, percent_lift = 0, min_lift = FALSE) {

alpha_1 <- as.numeric(alpha_1[1])
beta_1 <- as.numeric(beta_1[1])
alpha_2 <- as.numeric(alpha_2[1])
beta_2 <- as.numeric(beta_2[1])

...

}
2

Другие решения


По вопросам рекламы [email protected]