我在连接我写给Tableau的R函数时遇到了很多麻烦。该功能依赖于Rcpp。
在R中,如果我拨打prob_1_beats_2(1, 2, 3, 4)
它就可以了。但是,当我尝试使用Rserve连接到Tableau时,出现此错误:
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的常量值,但我正在尝试将其用于调试目的。
答案 0 :(得分:2)
似乎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])
...
}