使对象可以在R中的函数外部访问

时间:2017-04-03 06:14:27

标签: r function

我有一个名为“p”的函数。在这个函数中,有一个名为“marginal”的对象,我需要在调用时在该函数之外进行识别和检索。现在,当我在函数外部调用对象“边缘”时,我收到一条错误信息:

object 'marginal' not found

问题:如何在功能之外使“边缘”可识别?

p <- function(t, N1, N2=NULL, delta) {

    efN = ifelse(is.null(N2), N1, N1*N2/(N1+N2))
    df  = ifelse(is.null(N2), N1 - 1, N1 + N2 - 2)

    prior <- function(delta) dnorm(delta, 0, 1)
    likelihood <- function(delta) dt(t, df, delta*sqrt(efN) )

    marginal <- integrate(function(x) prior(x)*likelihood(x), -Inf, Inf)[[1]]

    post <- function(x) prior(x)*likelihood(x) / marginal

    return(post(delta))

    list(marginal) ## What to use instead of list to object "marginal" recognizable 
                    # outside the function?
 }

 marginal

object 'marginal' not found

2 个答案:

答案 0 :(得分:2)

最适合您的解决方案是将您当前的函数重构为较小的函数,以便您可以轻松地分别获取marginal的值。然后,用它来完成当前的计算。

话虽如此,如果你想快速修复,可以使用父作用域赋值运算符<<-,例如

marginal <- NULL

p <- function(t, N1, N2=NULL, delta) {
    efN = ifelse(is.null(N2), N1, N1*N2/(N1+N2))
    df  = ifelse(is.null(N2), N1 - 1, N1 + N2 - 2)

    prior <- function(delta) dnorm(delta, 0, 1)
    likelihood <- function(delta) dt(t, df, delta*sqrt(efN) )

    # note the assignment being done here carefully
    marginal <<- integrate(function(x) prior(x)*likelihood(x), -Inf, Inf)[[1]]

    post <- function(x) prior(x)*likelihood(x) / marginal

    return(post(delta))
}

# now marginal contain the value assigned in the function call above

但是,通常不建议采取这种方法。我只是提供它作为快速修复,强烈建议您重新考虑您的代码设计。

答案 1 :(得分:0)

要从函数内部访问多个值,请确保通过将它们放入列表中来返回要访问的所有值。然后返回列表,分配函数调用的结果,并访问所需的值:

multi_return = function() {
    x = 3
    y = 4
    res = list(x = x, y = y)
    return(res)
}

results = multi_return()
y = results$y
y
# Output:
## [1] 4

这种方法通常比使函数进行全局赋值更受欢迎,因为调用函数会产生不可预测的副作用。