我正在尝试创建彼此嵌入的三个函数,但是不断出现找不到对象的错误。第一个函数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))
答案 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) {}
时,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