【问题标题】:R package not loading `Imports` packagesR包没有加载`Imports`包
【发布时间】:2018-02-07 16:20:58
【问题描述】:

我正在开发一个包,该包的功能依赖于 dplyr 以及许多其他包。正如 H. Wickham 在他的 R Packages 书中所建议的那样,我在 Description 文件中包含了 Imports 下的所有必要软件包。

Imports:
  apaTables,
  data.table,
  dplyr,
  magrittr,
  plyr,
  rlang,
  sjstats,
  stats

然后在函数体中使用namespace(函数的细节在此不必赘述;我要强调的是,我使用的是Hadley在他的书中推荐的packagename::fun()格式):

#'
#' @title Confidence intervals for Partial Eta Squared
#' @name partialeta_sq_ci
#' @author Indrajeet Patil
#'
#' @param lm_object stats::lm linear model object
#' @param conf.level Level of confidence for the confidence interval
#' @importFrom magrittr %>%
#' @export

partialeta_sq_ci <- function(lm_object, conf.level = 0.95) {
  # get the linear model object and turn it into a matrix and turn row names into a variable called "effect"
  # compute partial eta-squared for each effect
  # add additional columns containing data and formula that was used to create these effects

  x <-
    dplyr::left_join(
      # details from the anova results
      x = data.table::setDT(x = as.data.frame(as.matrix(
        stats::anova(object = lm_object)
      )),
      keep.rownames = "effect"),
      # other information about the results (data and formula used, etc.)
      y = data.table::setDT(x = as.data.frame(
        cbind(
          "effsize" = sjstats::eta_sq(
            model = stats::anova(object = lm_object),
            partial = TRUE
          ),
          "data" = as.character(lm_object$call[3]),
          "formula" = as.character(lm_object$call[2])
        )
      ),
      keep.rownames = "effect"),
      # merge the two preceding pieces of information by the common element of Effect
      by = "effect"
    )
  # create a new column for residual degrees of freedom
  x$df2 <- x$Df[x$effect == "Residuals"]
  # remove sum of squares columns since they will not be useful
  x <-
    x %>%
    dplyr::select(.data = .,
                  -c(base::grep(pattern = "Sq", x = names(x))))
  # remove NAs, which would remove the row containing Residuals (redundant at this point)
  x <- na.omit(x)
  # rename to something more meaningful and tidy
  x <- plyr::rename(x = x,
                    replace = c("Df" = "df1",
                                "F value" = "F.value"))
  # rearrange the columns
  x <-
    x[, c("F.value",
          "df1",
          "df2",
          "effect",
          "effsize",
          "Pr(>F)",
          "data",
          "formula")]
  # convert the effect into a factor
  x$effect <- as.factor(x$effect)
  # for each type of effect, compute partial eta-squared confidence intervals, which would return a list
  ci_df <-
    plyr::dlply(
      .data = x,
      .variables = .(effect),
      .fun = function(data)
        apaTables::get.ci.partial.eta.squared(
          F.value = data$F.value,
          df1 = data$df1,
          df2 = data$df2,
          conf.level = conf.level
        )
    )
  # get elements from the effect size confidence intervals list into a neat dataframe
  ci_df <-
    plyr::ldply(
      .data = ci_df,
      .fun = function(x)
        cbind("LL" = x[[1]],
              "UL" = x[[2]])
    )
  # merge the dataframe containing effect sizes with the dataframe containing rest of the information
  effsize_ci <- base::merge(x = x,
                            y = ci_df,
                            by = "effect")
  # returning the final dataframe
  return(effsize_ci)

}

但是当我构建包并使用该功能时,它给了我以下错误-

Error in x %>% dplyr::select(.data = ., -c(base::grep(pattern = "Sq",  : 
  could not find function "%>%"

我做错了什么?

附:如果您需要更多详细信息, GitHub存储库:https://github.com/IndrajeetPatil/ipmisc 有问题的功能:https://github.com/IndrajeetPatil/ipmisc/blob/master/R/partialeta_sq_ci.R 描述文件:https://github.com/IndrajeetPatil/ipmisc/blob/master/DESCRIPTION

【问题讨论】:

  • 您没有导入管道运算符%&gt;%。我建议为这种特殊情况添加 @importFrom 标记
  • @RolandASc 不应该在Description 文件中将magrittr 添加到Imports 自动处理这个问题吗?无论如何,我确实在函数中添加了#' @importFrom magrittr %&gt;% 调用,但我仍然得到同样的错误。只有当我调用library(dplyr) 时,错误才会消失,但这对于包内的 R 脚本中的函数来说是一个很大的禁忌。所以不知道我应该怎么做才能摆脱这个错误。
  • Roxygen 与DESCRIPTION 文件的交互作用不大。要将导入到您的 NAMESPACE,您需要将它们放在标签中的某个位置。添加“@importFrom”后是否重新运行“roxygenize()”?请注意,管道也存在于‘dplyr’中,所以如果这就是你想要的‘magrittr’,你甚至可以删除那个包
  • 呵呵,不知道!好的,这就是现在发生的事情:如果我在 Rstudioroxygenize() 中打开有问题的 R 包项目,该功能将起作用。但是如果我退出并重新进入项目,然后使用包中的函数而不首先运行roxygenize(),它再次给出相同的错误。我猜我缺少一些关于 roxygen2 应该如何在包环境中运行的关键功能。
  • 原来这是问题所在:stackoverflow.com/questions/29981439/… 默认创建的 NAMESPACE 文件不包含 roxygen2 创建的任何内容,需要删除并重新创建。不知道为什么会这样,但是当我这样做时,事情又开始起作用了。

标签: r dplyr r-package roxygen2 magrittr


【解决方案1】:

总结一下,这里有几个问题:

  • 使用packagename::fun() 是一个不错的选择,但对操作员来说效果不佳。特别是对于管道 (%&gt;%),使用例如相反,一个函数会破坏它的目的。

  • @importFrom 标签优于@import,因为它更窄更明确。在调用roxygen2::roxygenize() 时,这两者都会影响 NAMESPACE 文件。但是请注意,roxygen 不会与用户定义的 NAMESPACE 文件混淆,因为通常情况下人们宁愿自己手动处理它(例如,当包提供 S3 类和/或方法时),然后需要撤消 roxygen 的覆盖。删除现有的 NAMESPACE 文件会让 roxygen 重新创建它。 Roxygen 通常会在 NAMESPACE 文件中添加一行来识别它是否应该更新它:

    #roxygen2生成:请勿手动编辑

  • DESCRIPTION 文件中的依赖项既不会被 roxygen 修改,也不会被 roxygen 添加到 NAMESPACE 中(请注意,这会导致完整的包导入,我们宁愿通过 @importFrom 避免这种情况)。需要手动处理DESCRIPTION文件,确保Imports:部分涵盖通过NAMESPACE使用的所有包,即通过@import@importFrom,以及通过@987654329 @

【讨论】:

    【解决方案2】:

    我在DESCRIPTION 文件中使用以下内容解决了这个问题:

    Depends: tidyverse, rlang
    

    这个负载magrittr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2015-12-20
      • 2018-04-13
      相关资源
      最近更新 更多