Как можно сделать глобальные переменные в R видимыми для C функции, вызываемой из R? - PullRequest
2 голосов
/ 11 февраля 2020

Я использую функцию int2 в пакете R rmutil для численного вычисления двойных интегралов. Функция, которую я хочу интегрировать, представляет собой двумерную функцию нормальной плотности вероятности :

enter image description here

, которая имеет две переменные (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))

I тогда интегрируйте функцию с помощью 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 глобально, используя mu_x <<- 0, mu_y <<- 0, sigma_x <<- 1, sigma_y <<- 1 и rho <<- 0.5, чтобы их значения были видны в функциональной среде rmutil::int2, но это не сработало. Когда я изучил исходный код rmutil::int2, я обнаружил вероятную причину: в этой функции есть вызов функции C с использованием .C. Я предполагаю, что даже глобальные переменные в R не видны для C функций, вызываемых внутри R, и, таким образом, функция C не сможет оценить bvtnorm (через f2, через rmutil::int2), потому что mu_x, mu_y и др. c. неизвестны. Таким образом, мой вопрос:

Есть ли способ сделать переменные в среде R видимыми для C функций, вызываемых из R?

Я предполагаю, что один из возможных решением было бы изменить функцию rmutil::int2 и функцию C, которые она вызывает для отправки параметров mu_x, mu_y и т. д. c. к функции C. Тем не менее, я бы хотел, по возможности, избегать изменения чужого кода в существующем пакете CRAN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...