несколько функций, возвращающих ошибку объекта не найден - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать три встроенные друг в друга функции, но получаю сообщение об ошибке, что объект не найден. первая функция 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 голосов
/ 31 августа 2018

Я заметил несколько вещей

Прежде всего: если переменная создается внутри функции (), она доступна только в скрытой среде этой функции. Он недоступен в глобальной среде, а также недоступен в других функциях.

В функции 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) {}, x, y и z являются входами для этой функции. Кажется, что вы записали некоторые переменные, которые созданы внутри функции. Это приведет к (даже большему количеству) ошибок, поскольку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...