У меня много проблем с подключением функции 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, но я пытаюсь сделать это в целях отладки.
Кажется, что 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])
...
}