0

我猜是函数gamma only works for a vector as the input. Is there a way to apply it to a scalar, say,gamma(3)`?

实际上,如果我将gamma(3)其作为代码的一部分包含在内,我会得到正确的输出,但是有一条警告消息......

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List fool(NumericVector vec){
  double res = 0;
  res = sum(gamma(vec)) + gamma(3);
  List result;result["num"] = res;
   return result;
}

这是警告消息:

exp.cpp:7:27: 警告: 'gamma' 已弃用: 首先在 OS X 10.9 中弃用 [-Wdeprecated-declarations]
res = sum(gamma(vec)) + gamma(3);
^ /usr/include/math.h:720:15: 注意:'gamma' 已被明确标记为已弃用 extern double gamma(double) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_9, __IPHONE_NA, __IPHONE_NA); ^ 1 个警告生成。

4

1 回答 1

2

感谢您发布代码。您因粗心使用名称空间而成为受害者。gamma()在 Rcpp 命名空间中有一个(向量化的) ——第一个参数,并且在 C 数学库中有一个标量gamma()(首选:)。tgamma()最好是明确的。

更正代码如下:

#include <Rcpp.h>

// [[Rcpp::export]]
double fool(Rcpp::NumericVector vec){
    double res =
        Rcpp::sum(Rcpp::gamma(vec)) +   // Rcpp sugar sum() and gamma() on vector
        ::tgamma(3.0);                  // math library tgamma of double
    return res;
}

/*** R
v <- 1:5
fool(v)
sum(gamma(v)) + gamma(3)
*/

输出

R> sourceCpp("/tmp/shuang.cpp")

R> v <- 1:5

R> fool(v)
[1] 36

R> sum(gamma(v)) + gamma(3)
[1] 36
R> 
于 2018-04-17T00:29:00.563 回答