c++ - 从 Tableau 调用 Rcpp 函数时出错。如何解释和调试 Rserve 日志?

标签 c++ r rcpp tableau-api rserve

我在将我编写的 R 函数连接到 Tableau 时遇到了很多问题。该函数依赖于 Rcpp。

在 R 中,如果我调用 prob_1_beats_2(1, 2, 3, 4) 它工作正常。但是,当我尝试使用 Rserve 连接到 Tableau 时,出现此错误:

eval(expr, envir, enclos) 错误:需要一个值

我似乎无法追踪。我尝试在 Debug模式下运行 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 似乎总是将值作为 vector 传递给 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 等), c(2 , 2 , 2 , 2 , 2 等)等等作为函数的参数。由于某种原因,这是在没有 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])

  ...

}

关于c++ - 从 Tableau 调用 Rcpp 函数时出错。如何解释和调试 Rserve 日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28227388/

相关文章:

c++ - 什么类型的转换适合这里?

c++ - 仅当您在 QML 中单击 Blackberry Cascades 模拟器时,您如何响应点击文本字段?

c++ - 什么在Windows Server 2003上使用了这么多未提交的 “private data”?

R:当差异低于某个阈值时的平均序列值

c++ - 如何使用 Rcpp 库将 C++ 中包含 double 值的 vector vector 转换为 R 中的矩阵?

c++ - C++11 类型检查代码的奇怪编译器警告

r - Shiny 的显示数字而不是日期

r - dplyr 包 : How can I query large data frame using like '%xyz%' SQL syntax?

java - 第二次调用 re.eval("source()) 因 JRI 失败

c++ - 使用 Rcpp 查找重复项