我是R的新手,我正在尝试编写一个函数,要求它只选择某个时间间隔内的值,所以如果它位于[lower,upper]中,我决定使用k = 1 0如果它位于其他地方(其中较低和较高的位置已在函数中较早定义。但是,当我尝试为函数赋值时,它总是带回来
myfun(10,0.5,0.05)
#Error in k[i] <- function(p) ifelse(p >= lower & p <= upper, 1, 0) :
# incompatible types (from closure to double) in subassignment type fix
我真的不知道这意味着什么,我已经尝试找到答案,但大多数网页只是说明如何解决他们的特定问题,而不是说出它实际意味着什么。也许我看起来不够努力,如果我没有,我道歉,但任何帮助都会非常感激。这是完整的功能,如果它会有所帮助:
myfun <- function(a, q, m) {
k <- rep(0,a+1)
bin.prob <- rep(0,a+1)
for (i in 1:(a+1)) {
x <- i-1
qhat <- x/a
z <- qnorm(1-m/2)
upper <- qhat+(z*sqrt(qhat*(1-qhat)*(a^-1)))
lower <- qhat-(z*sqrt(qhat*(1-qhat)*(a^-1)))
k[i] <- function(q) ifelse(q>=lower & q<=upper, 1, 0)
bin.prob[i] <- dbinom(x,a,q)
}
C <- sum(k*bin.prob)
return(C)
}
myfun(10,0.5,0.05)
#Error in k[i] <- function(q) ifelse(q >= lower & q <= upper, 1, 0) :
# incompatible types (from closure to double) in subassignment type fix
新问题 嘿,我在尝试调整数据集时尝试调整此函数时遇到了一个新问题,即 a 变为 a + 4 和 x 变成 x + 2
> myfun2 <- function(a,q,m) {
+ fn <- function(a) a+4
+ abar <- fn(a)
+ kadj <- rep(0,abar+1)
+ bin.prob.adj <- rep(0,abar+1)
+ for (j in 1:(abar+1)) {
+ x <- j-1
+ fx <- function(x) x+2
+ xbar <- fx(x)
+ qhatadj <- xbar/abar
+ z <- (1-(m/2))
+ upperadj <- qhatadj+(z*sqrt(qhatadj*(1-qhatadj)*(abar^-1)))
+ loweradj <- qhatadj-(z*sqrt(qhatadj*(1-qhatadj)*(abar^-1)))
+ kadj[j] <- q>=loweradj & q<=upperadj
+ bin.prob.adj[j] <- dbinom(xbar,abar,q)
+ }
+ D <- sum(kadj*bin.prob.adj)
+ return(D)
+ }
> myfun2(10,0.5,0.05)
[1] NA
Warning messages:
1: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced
2: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced
3: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced
4: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced
我一直试图找到答案,为什么会出现这种情况,并且发现NaNs警告可能意味着存在负平方根?但是我不明白为什么会出现这种情况。这对我来说可能是不好的编码,或者可能是完全不同的东西(我是R的新手)。谢谢你的帮助。
答案 0 :(得分:0)
如错误消息所示,问题从以下行开始:
k[i] <- function(q) ifelse(q >= lower & q <= upper, 1, 0)
在上面的行中,当你真的想要在标量function(q) ifelse(q >= lower & q <= upper, 1, 0)
上分配评估此函数的结果时,你正在为向量k
的每个元素分配一个函数q
。作为原始函数的参数给出。另请注意,闭包function(q)
的环境与定义它的函数的环境不同。必须使用参数显式调用它才能进行求值。因此,当你点击这条线时:
C <- sum(k * bin.prob)
R尝试将函数function(q)
本身乘以bin.prob
,抛出错误,当你想要做的是将function(q)
的结果与标量{{1}相乘时在原始函数的参数中定义。在这种情况下,似乎根本不需要定义q
。作业可以替换为:
function(q)
由于R在必要时将逻辑向量强制转换为数字向量,将k[i] <- ifelse(q >= lower & q <= upper, 1, 0)
视为1并将TRUE
视为0,上述分配可以更简洁地表达为:
FALSE