【问题标题】:Load dependencies only for one function仅加载一个函数的依赖项
【发布时间】:2019-06-05 11:02:13
【问题描述】:

我正在创建一个包含一些功能的包。只有一个辅助功能需要plotly

但是,当我使用devtools 安装时,我收到了unused arguments in layout(yaxis = ay,... 的注释,然后我阅读了Hadley's article about imports vs depends。使用 import 不会删除注释,但在 NAMESPACE 文件中添加 plotlydepends 可以解决问题。

接下来我阅读了有关“搜索路径”的段落。在这里,哈德利指出

您永远不应该在包中使用 require() 或 library():相反,请使用 DESCRIPTION 中的 Depends 或 Imports 字段

我现在的问题是使用plotly 的函数更像是包的附加组件。所有其他(更重要的)功能都与 base-R 一起使用。 因此,我只想将plotly 用于需要它的一个功能。

  1. install 期间不创建注释是否可行?
  2. 为什么requirelibrary 在一个包中如此糟糕?
  3. 可以先使用requireNamespace,然后再使用require吗?

这里是一些示例代码:

#' Some plotly function
#'
#' Some very long description
#'
#' @param x_vec A numeric vector
#' @param y_vec A numeric vector
#' @keywords Some keywords
#' @return A plotly object
#' @export
#' @examples

debugMinEx<-function(x_vec,y_vec){

ay <- list(title = "",zeroline = FALSE,showline = FALSE,
           showticklabels = FALSE, showgrid = FALSE,
           scaleanchor="x",scaleratio=1) ## empty axis
ax <- list(title = "",zeroline = FALSE,showline = FALSE,
           showticklabels = FALSE, showgrid = FALSE) ## empty axis
my_legend<-list(font = list(family = "sans-serif", size = 14, color = "#000000"),
                x = 0, y = -0.05,orientation = "h")

plot_ly() %>%
  add_trace(x=x_vec,y=y_vec,
            type='scatter',mode='lines') %>%
  layout(yaxis = ay,xaxis=ax,
          legend = my_legend)
}

【问题讨论】:

  • 您可能希望使用Suggests 而不是Importscran.r-project.org/doc/manuals/r-release/…
  • 所以最佳实践是使用Suggests 和例如在requireNamespace-if 子句中使用plotly::plot_ly 函数?调用plotly:: 不会使函数变慢吗?还是我的记忆出卖了我:P
  • 每个函数调用,即使是::,都有开销,可能在微秒级。如果您在循环中运行此函数数百万次,您会注意到一两秒的差异。但我的猜测是你不会产生数百万的情节......
  • if 子句的开销大于:: 的开销。我不会将这种结构用于性能关键的功能。

标签: r plotly devtools roxygen2


【解决方案1】:

为此使用建议

您可以在 Writing R Extensions 或 Hadley 的 Package Basics: Decription 中了解它。在这两种情况下,建议都是

  • 可选依赖项位于包 DESCRIPTIONSuggests 字段中。
  • 在函数中使用if (requireNamespace) 来测试包是否存在。

类似这样的:

if (requireNamespace("plotly", quietly = TRUE)) {
      # do your plotly stuff
   } else {
      # do non-plotly stuff
      # maybe as simple as stop("Please install plotly to use this function")
   }

至于你是否可以在requireNamespace 之后使用require - 这似乎毫无意义。 Hadley 的建议似乎很明确,使用requireNamespace("plotly") 加载包,然后使用plotly:: 调用所需的函数。

如果您不想忽略此建议,那么只需第一次执行require。使用requireNamespace 后跟require 是多余的。如您的链接中所述,requireNamespace 加载一个包而不附加它。 require 加载和附加。

【讨论】:

  • 感谢您的解释。这消除了大部分模糊不清的困惑。我假设不使用requirelibrary 是为了增加用户的透明度。我的意思是使用例如require 在函数中可能会引起混淆,因为用户可能会再次尝试附加包,对吧?
  • 是的。 Imports vs Depends 链接中的几段:“一个好的包...最小化对全局环境的更改(包括搜索路径)”。使用library()require() 会更改用户可能不想要的搜索路径。使用requireNamespace:: 可以在不更改搜索路径的情况下为用户提供相同的结果。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多