回复:即使我已经安装了软件包,也无法在R中找到功能

时间:2018-07-27 06:07:48

标签: r foreach doparallel

我的论文中有这段代码,即使正确地重新安装了必要的软件包,它仍然找不到该功能。

expoUtility <- function(x, alpha, param_beta, W){
  (1-exp(-alpha*(W + x)^(1-param_beta)))/alpha
}

Round.Probability.Table <- cbind(Round.Probability.Table,c(1:10))
Round.Probability.Table <- Round.Probability.Table[,1:3]
names(Round.Probability.Table) <- c("Round","CasesAtEnd","Probability")

for (i in 1:9) {
  Round.Probability.Table$Probability[i] <- 1/choose(Round.Probability.Table$CasesAtEnd[i],Round.Probability.Table$CasesAtEnd[i+1])
}

LL.expoUtility <- function (parameters) {

  alpha <- parameters[1]
  param_beta <- parameters[2]
  W <- parameters[3]
  sigma <- parameters[4]

  LL <- foreach(i=1:nrow(data), .combine = "c") %dopar% {

    sv <- expoUtility(data$Bank.Offer[i], alpha = alpha, param_beta = param_beta, W = W)

    cv <- combn(Set.Cases.Remaining[[i]], Round.Probability.Table[1+match(data$Round[i], Round.Probability.Table$Round),2]) %>%
      apply(2,mean) %>%
      sapply(FUN = predictedBankOffer, b = data$Bank.Offer.Percent[i], r = data$Round[i]) %>%
      sapply(FUN = expoUtility, alpha = alpha, param_beta = param_beta, W = W)*Round.Probability.Table$Probability[data$Round[i]]
    cv <- sum(cv)

    delta <- combn(Set.Cases.Remaining[[i]], Round.Probability.Table[1+match(data$Round[i], Round.Probability.Table$Round), 2]) %>%
      apply(2,mean) %>%
      sapply(FUN = predictedBankOffer, b = data$Bank.Offer.Percent[i], r = data$Round[i]) %>%
      sapply(FUN = expoUtility, alpha = alpha, param_beta = param_beta, W = W) - cv 
    delta <- delta^2 %>%
      sum() %>%
      sqrt()

    if (data$Answer[i] == 0) {
      z <- (cv-sv)/(delta*sigma)
    } else {
      z <- (sv-cv)/(delta*sigma)
    }
  }
  LL <- sapply(LL, FUN = pnorm, mean = 0, sd = 1, log.p = TRUE)
  return(LL)
}

LL.logUtility <- function (parameters) {

  sigma <- parameters[1]

  LL <- foreach(i=1:nrow(data), .combine = "c") %dopar% {

    sv <- log(data$Bank.Offer[i])

    cv <- combn(Set.Cases.Remaining[[i]], Round.Probability.Table[1+match(data$Round[i], Round.Probability.Table$Round),2]) %>%
      apply(2,mean) %>%
      sapply(FUN = predictedBankOffer, b = data$Bank.Offer.Percent[i], r = data$Round[i]) %>%
      sapply(FUN = log)*Round.Probability.Table$Probability[data$Round[i]]
    cv <- sum(cv)

    delta <- combn(Set.Cases.Remaining[[i]], Round.Probability.Table[1+match(data$Round[i], Round.Probability.Table$Round), 2]) %>%
      apply(2,mean) %>%
      sapply(FUN = predictedBankOffer, b = data$Bank.Offer.Percent[i], r = data$Round[i]) %>%
      sapply(FUN = log) - cv 
    delta <- delta^2 %>%
      sum() %>%
      sqrt()

    if (data$Answer[i] == 0) {
      z <- (cv-sv)/(delta*sigma)
    } else {
      z <- (sv-cv)/(delta*sigma)
    }
  }
  LL <- sapply(LL, FUN = pnorm, mean = 0, sd = 1, log.p = TRUE)
  return(LL)
}

ptm.1 <- proc.time()
mle.1 <- maxLik(logLik = LL.expoUtility, start = c(0.1233,0.958,82370,0.1625), method = "NM", tol = 1e-20, iterlim = 3)

    Error in { : task 1 failed - "could not find function "expoUtility""
    Called from: e$fun(obj, substitute(ex), parent.frame(), e$data)

我猜测问题出在foreach和doParallel软件包上。我也使用Windows操作系统,并且从MAC OS获取代码。这会影响编码吗?

1 个答案:

答案 0 :(得分:0)

我认为问题出在foreach上,有一个参数.packages为每个工人装载包裹。在foreach的帮助下:

  

.packages :任务所依赖的软件包的字符向量。如果   例如,需要加载R包,此选项可用于加载   每个工人上的那个包裹。

因此,我认为您需要在foreach中的那些函数上声明要使用的包,如下所示:

LL <- foreach(i=1:nrow(data), .packages=c("name of the package you are using"),
              .combine = "c") %dopar% {
"Rest of your code"
 }