多个函数返回未找到对象的错误

时间:2018-08-31 13:47:03

标签: r

我正在尝试创建彼此嵌入的三个函数,但是不断出现找不到对象的错误。第一个函数f是主要函数,第二个函数g输出w,y和z,最后一个函数k使用第二个函数的结果来计算r。但我一直收到找不到对象的错误,请问有没有更好的方法来重组下面的代码以消除错误?

    f <- function(alfa,e1,e2,n1,n2,t){
    n <- n1+n2
    N <- sum(n)
    t <- n/N
    a <- e1
    b <- n1 - e1
    c <- e2
    d <- n2 - e2
    #---- function 1
    g <- function(a,c,w,v,z){
    v <- (1/a) + (1/c) - (1/n1)- (1/n2)
    y <- (a/n1)/(c/n2)
    w <- 1/v
    cum_w <- cumsum(w)
    var_peff <- 1/cum_w
    se <- sqrt(var_peff)
    cum_s2 <- cumsum(s2)
    lgy <- log((a/n1)/(c/n2))
    s2 <- w*lgy
    p.eff <- cum_s2/cum_w
    z <- abs(p.eff/se)
    }
    #---- function 2
    h <- function(za,pe){
    pe <- 2*(1 - pnorm(qnorm(1-(alfa/2))/sqrt(t)))
    za <- qnorm(1 - pe)
    }
    #----- function 3
    k <- function(za,pe){
    r <- za/pe
    }
    ans <- list(t=t, y=y, v=v, w=w, zup=za)
    return(data.frame(ans))
    }
    f(alfa = 0.05, e1 = c(3,9,12,34,77), e2 = c(12,26,25,66,130), n1 = 
    c(18,33,85,162,481), n2 = c(18,40,97,146,489))

1 个答案:

答案 0 :(得分:0)

我注意到了几件事

首要:如果在function()中创建了变量,则该变量仅在该函数的隐藏环境中可用。在全局环境中不可用,在其他功能中也不可用。

在功能g()中,您创建y <- (a/n1)/(c/n2)。但是y不是在您的全局环境中创建的。 稍后,您尝试使用以下函数调用函数y中的f()ans <- list(t=t, y=y, v=v, w=w, zup=za)

要使用y,应在调用它的函数内部或在全局环境中为其分配一个值。 这可以通过直接运行部分代码来实现,而不是从函数内部调用,也可以通过编写在其中创建这些值并分配它们的函数来编写(例如:

za <- function(pe) {
    za <- qnorm(1 - pe)
    return(za)
}

另一件事是,在创建函数fun <- function(x,y,z) {}时,xyz是该函数的输入。似乎您记下了在函数内创建的一些变量。这将导致错误(甚至更多),因为R期望比指定的所有请求功能参数更多。换句话说,功能fun <- function(x,y,z) {do something}需要如下命令:fun(x=10, y='something', z=100)

我注意到的另一件事是您的函数f()需要一个名为t的参数。调用f(alfa = 0.05, e1 = c(3,9,12,34,77), e2 = c(12,26,25,66,130), n1 = c(18,33,85,162,481), n2 = c(18,40,97,146,489))时,您未指定t={value}。解决上述错误后,这将导致错误

编辑:在请求重组功能之后,我仔细查看了一下,发现代码中的子功能实际上很丰富。一切都可以在一个功能中完成。我下面要做的只是删除函数调用,但保留函数的内容并重新排序一两个命令,以便在需要之前创建它们。 结果:

f <- function(alfa,e1,e2,n1,n2,t){
  n <- n1+n2
  N <- sum(n)
  t <- n/N
  a <- e1
  b <- n1 - e1
  c <- e2
  d <- n2 - e2

    v <- (1/a) + (1/c) - (1/n1)- (1/n2)
    y <- (a/n1)/(c/n2)
    w <- 1/v
    cum_w <- cumsum(w)
    var_peff <- 1/cum_w
    se <- sqrt(var_peff)
    lgy <- log((a/n1)/(c/n2))
    s2 <- w*lgy

    cum_s2 <- cumsum(s2)

    p.eff <- cum_s2/cum_w
    z <- abs(p.eff/se)

    pe <- 2*(1 - pnorm(qnorm(1-(alfa/2))/sqrt(t)))
    za <- qnorm(1 - pe)

    r <- za/pe
  ans <- list(t=t, y=y, v=v, w=w, zup=za)
  return(data.frame(ans))
}

 f(alfa = 0.05, e1 = c(3,9,12,34,77), e2 = c(12,26,25,66,130), n1 = 
    c(18,33,85,162,481), n2 = c(18,40,97,146,489))

输出:

           t         y          v         w      zup
1 0.02294455 0.2500000 0.30555556  3.272727      Inf
2 0.04652645 0.4195804 0.09426962 10.607871      Inf
3 0.11599745 0.5477647 0.10125935  9.875631 5.636466
4 0.19630338 0.4642724 0.03154113 31.704639 4.271615
5 0.61822817 0.6021590 0.01655533 60.403512 2.235971