R包无法加载“Imports”包

3
我正在开发一个程序包,其中的一个函数依赖于许多其他程序包,其中包括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 "%>%"

我做错了什么?

P.S. 如果需要更多细节, 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


2
你没有导入管道运算符%>%。我建议在这种情况下添加@importFrom标签。 - RolandASc
1
@RolandASc 如果在“描述”文件中将magrittr添加到“导入”中,这样做不会自动解决问题吗? 无论如何,我确实在函数中添加了#' @importFrom magrittr %>%调用,但仍然出现相同的错误。 只有当我调用library(dplyr)时,错误才会消失,但对于包内R脚本中的函数来说,这是一个大忌。所以不确定该怎么做才能摆脱这个错误。 - Indrajeet Patil
1
Roxygen与DESCRIPTION文件的交互不多。要将导入项放入您的NAMESPACE中,您需要在标签中某处拥有它们。在添加了“@importFrom”后,您是否重新运行了“roxygenize()”?请注意,“dplyr”中也存在管道,因此如果您只需要来自“magrittr”的管道,则甚至可以删除该软件包。 - RolandASc
哦,我不知道!好的,现在发生了什么:如果我在Rstudio中打开有问题的R包项目并运行roxygenize(),该函数就可以工作。但是,如果我退出并重新进入该项目,然后在没有先运行roxygenize()的情况下使用该包中的函数,它会再次出现相同的错误。我猜我错过了一些关键功能,这些功能涉及到roxygen2在包环境中应该如何操作。 - Indrajeet Patil
原来问题出在这里:https://stackoverflow.com/questions/29981439/rstudio-building-package-with-roxygen2-not-producing-namespace-file 默认情况下创建的NAMESPACE文件不包含roxygen2创建的任何内容,需要将其删除并重新创建。不确定为什么会这样,但当我这样做时,一切又开始正常工作了。 - Indrajeet Patil
@RolandASc 你能否将此标记为已回答或重复,以便关闭此线程? - Indrajeet Patil
2个回答

2

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

  • 使用packagename::fun()是一个不错的选择,但对于运算符来说效果不佳。特别是对于管道(%>%),使用一个函数代替会破坏其本意。

  • @importFrom标签比@import更好,因为它更加明确和具体。这两者都会在调用roxygen2::roxygenize()时影响NAMESPACE文件。然而需要注意的是,roxygen不会干扰用户定义的NAMESPACE文件,因为通常情况下人们更愿意自己手动处理(例如当一个包提供S3类和/或方法时),如果被roxygen覆盖了,则需要撤销。删除现有的NAMESPACE文件将让roxygen重新创建它。Roxygen通常会添加一行到NAMESPACE文件中以识别是否应该更新它:

    # Generated by roxygen2: do not edit by hand

  • DESCRIPTION文件中的依赖关系既不被roxygen修改,也不被添加到NAMESPACE中(请注意,否则这将导致完整的包导入,我们通过@importFrom而不是这样做)。需要手动处理DESCRIPTION文件,确保Imports:部分覆盖了通过NAMESPACE使用的所有包,即通过@import@importFrom以及通过packagename::fun()使用的包。


0
我在我的DESCRIPTION文件中使用以下方法解决了这个问题:
Depends: tidyverse, rlang

加载 magrittr


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接