Я заметил несколько вещей
Прежде всего: если переменная создается внутри функции (), она доступна только в скрытой среде этой функции. Он недоступен в глобальной среде, а также недоступен в других функциях.
В функции 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