Re: не могу найти функцию в R даже после установки пакетов

У меня есть этот код для моей статьи, и он все еще не может найти функцию, даже когда я правильно переустановил необходимые пакеты.

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. Повлияет ли это на кодировку?


person Paolo    schedule 27.07.2018    source источник
comment
Загрузите пакеты на рабочих. См. help("foreach") и параметр .packages.   -  person Roland    schedule 27.07.2018
comment


Ответы (1)


Думаю проблема кроется в foreach, есть параметр .packages, который загружает пакет для каждого воркера. Из помощи foreach:

.packages: вектор символов пакетов, от которых зависят задачи. Если ex требует загрузки пакета R, этот параметр можно использовать для загрузки этого пакета на каждом из рабочих процессов.

Итак, я думаю, вам нужно объявить пакет, который вы используете для этих функций, в foreach, например:

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