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