r - 如何使 R 中的全局变量对从 R 中调用的 C 函数可见?
问题描述
我正在使用int2
R 包中的函数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
返回相同的值:x
y
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 <<- 0
mu_y <<- 0
sigma_x <<- 1
sigma_y <<- 1
rho <<- 0.5
rmutil::int2
rmutil::int2
.C
bvtnorm
f2
rmutil::int2
mu_x
mu_y
有没有办法让 R 环境中的变量对从 R 中调用的 C 函数可见?
我认为一种可能的解决方案是修改rmutil::int2
函数和它调用的 C 函数,以将参数 mu_x、mu_y 等发送到 C 函数。但是,如果可能的话,我想避免在现有的 CRAN 包中修改其他人的代码。
解决方案
推荐阅读
- bootstrap-4 - PHPMailer & Bootstrap 4 警报
- css - 当 HTML5 页面中有很多 css 链接时,最佳实践是什么?
- excel - Excel VBA:如何从用户窗体内的评论中显示图片?
- python - 列出给定数量python需要哪些硬币
- node.js - 不确定是否正确安装 Angular CLI
- java - 为多态实体编写 Spring 数据存储库 - InheritanceType.SINGLE_TABLE
- python - 带有单词建议 Python 的语法/拼写检查
- facebook-graph-api - Facebook API - 发布到页面
- cron - Airflow schedular 不会在特定 schedule_interval 配置中选择 DAG(0 8 * * 5)
- asp.net - 激活 ILogManager 时出错:没有可用的匹配绑定,并且类型不可自绑定