首页 > 解决方案 > 如何使 R 中的全局变量对从 R 中调用的 C 函数可见?

问题描述

我正在使用int2R 包中的函数rmutil进行双积分的数值计算。我要积分的函数是双变量正态概率密度函数

在此处输入图像描述

它有两个变量(x 和 y)和五个参数。如果我让 mu_x=mu_y=0、sigma_x=sigma_y=1 和 rho=0.5,我可以在 R 中对函数进行如下编码:

f1 <- function(x, y) 1/(sqrt(3) * pi) * exp(-2/3 * (x^2 + y^2 - x*y))

int2然后我使用如下方式集成该功能:

rmutil::int2(f1, a=c(-Inf,-Inf), b=c(Inf,Inf))
[1] 0.9999998

好:积分的准确值为 1。

但是,我需要能够针对上述参数的不同值重复集成上述函数。我试图这样做如下:

bvtnorm <- function(x, y, mu_x = 0, mu_y = 0, sigma_x = 1, sigma_y = 1, rho = 0.5) {
  function(x, y) 
  1 / (2 * pi * sigma_x * sigma_y * sqrt(1 - rho ^ 2)) * 
    exp(- 1 / (2 * (1 - rho ^ 2)) * ((x - mu_x) / sigma_x) ^ 2 + 
          ((y - mu_y) / sigma_y) ^ 2 - 2 * rho * (x - mu_x) * (y - mu_y) / 
          (sigma_x * sigma_y))
}
f2 <- bvtnorm(x, y)

我们可以验证f1并为相同的输入f2返回相同的值:xy

f1(1, 1)
[1] 0.0943539
f2(1, 1)
[1] 0.0943539

但是,当我按如下方式运行int2时,它无法集成:f2

rmutil::int2(f2, a=c(-Inf,-Inf), b=c(Inf,Inf))
[1] NaN

我使用、、、和定义了要bvtnorm全局发送到的参数变量,以便它们的值在函数环境中可见,但这不起作用。当我检查源代码时,我发现了可能的原因:在这个函数中,有一个使用. 我认为即使是 R 中的全局变量对于在 R 中调用的 C 函数也是不可见的,因此 C 函数将无法评估(via , via ),因为,等是未知的。因此我的问题是:mu_x <<- 0mu_y <<- 0sigma_x <<- 1sigma_y <<- 1rho <<- 0.5rmutil::int2rmutil::int2.Cbvtnormf2rmutil::int2mu_xmu_y

有没有办法让 R 环境中的变量对从 R 中调用的 C 函数可见?

我认为一种可能的解决方案是修改rmutil::int2函数和它调用的 C 函数,以将参数 mu_x、mu_y 等发送到 C 函数。但是,如果可能的话,我想避免在现有的 CRAN 包中修改其他人的代码。

标签: rc

解决方案


推荐阅读