如何填充R中的环境

时间:2012-10-12 01:29:06

标签: r environment

我正在使用IMIS包(增量混合重要性采样)来估计参数。不幸的是,它被编写为在其调用的环境中查找函数likelihoodsample.priorprior,因此我无法将其包装在函数中(我的最终目标)。来自?IMIS的单变量示例正常,

require(IMIS)
likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
prior <- function(theta) dnorm(theta, 0, 5)
sample.prior <- function(n) rnorm(n, 0, 5)
result = IMIS(500, 3000, 100, 10)

## also fine using do.call (pertinent below)
result <- do.call(IMIS, args = list(B = 500, B.re = 3000, number_k = 100, D = 10))

但不出所料,将其包装在一个函数中不会:

rm(likelihood, prior, sample.prior, result)
imisWrap <- function() {
    likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
    prior <- function(theta) dnorm(theta, 0, 5)
    sample.prior <- function(n) rnorm(n, 0, 5)
    result = IMIS(500, 3000, 100, 10)
    return(result)
}
imisWrap() ## can't find sample.prior

认为解决这个问题的方法是在我的包装器中创建一个环境(或使用它的环境),然后使用do.call在该环境中运行IMIS,但是我不知道如何创建一个包含likelihoodpriorsample.priorresult的新环境。


编辑:使用@BenBolker的优秀评论我有一个改进但仍未尝试的尝试:

imisWrap2 <- function() {
    likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
    prior <- function(theta) dnorm(theta, 0, 5)
    sample.prior <- function(n) rnorm(n, 0, 5)
    imisEnv <- new.env()
    assign("likelihood", likelihood, envir = imisEnv)
    assign("sample.prior", sample.prior, envir = imisEnv)
    assign("prior", prior, envir = imisEnv)
    result = do.call(IMIS,
                     args = list(B = 500, B.re = 3000, number_k = 100, D = 10),
                     envir = imisEnv)
    return(result)
}

但是这仍然找不到功能。

2 个答案:

答案 0 :(得分:2)

你可以通过attach enviromnent(和detach使用后清理)来使用它:

imisWrap() <- function() {
    imisList <- list(
      likelihood = function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2),
      prior = function(theta) dnorm(theta, 0, 5),
      sample.prior = function(n) rnorm(n, 0, 5)
    )
    imisEnv <- as.environment(imisList)
    attach(imisEnv)
    result = IMIS(500, 3000, 100, 10)
    detach(imisEnv)
    return(result)
}

imisWrap()
[1] "5000 likelihoods are evaluated in 0 minutes"
[1] "Stage   MargLike   UniquePoint   MaxWeight   ESS"
[1]    1.000   -0.806 1796.246    0.001 2434.921
[1] "maximum posterior= -1.96 , likelihood= 0.61 , prior= -2.57 , time used= 0 minutes, convergence= 0"
...

但是,我回应@BenBolker,因为包装作者应该更干净地解决这个功能的问题。

答案 1 :(得分:2)

您可以将environment(IMIS) <- environment()放在imisWrap的顶部以使其生效。这仅修改了IMISimisWrap的行为。包命名空间中的函数版本未更改。