R,在函数

时间:2016-04-12 19:00:00

标签: r

我是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的新手)。谢谢你的帮助。

1 个答案:

答案 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