【问题标题】:Importing functions in R在 R 中导入函数
【发布时间】:2017-01-18 06:40:57
【问题描述】:

在 Python 中,我们有机会使用命令“import function from library as smth 从库中导入某个函数。我们R中有类似的东西吗? 我知道我们可以调用像“library::function()”这样的函数,我的问题主要是指“as”部分。

【问题讨论】:

  • x <- package::function 将分配xpackage::function。是这个意思吗?
  • 只需 library(smth) 加载 smth-pkg then call function whatever its name ... (NOT library::smth` 除非您确定该包中没有进一步调用函数)猜测有问题的反对票是为了证据没有做任何搜索的努力,只是一个猜测,而不是我的反对意见。无论如何,它们不是 R 中的库,它们是包。

标签: r function import


【解决方案1】:

这在 R 中并不常见,也没有必要这样做。赋值运算符<- 可用于为现有函数赋予新名称。例如,可以定义一个与 lubridate 的 year() 函数完全相同的函数:

asYear <- lubridate::year

有人可能会争辩说,通过这样做,year() 函数已从lubridate 包中“导入”,现在它被称为asYear()。事实上,新函数的作用是一样的(这并不奇怪,因为它相同的):

asYear(Sys.Date())
#[1] 2016

因此可以构造一个类比“从包导入为”,但这样做不是一个好主意。以下是我能想到的几个原因:

  • 调试已重命名库函数的代码将是 困难得多。
  • 文档不适用于重命名的函数。在此示例中,?asYear 不起作用,与 ?lubridate::yearlibrary(lubridate); help(year) 不同。
  • 函数不仅被重命名,而且被复制,这使得环境变得混乱并且在内存使用方面效率低下。
  • 代码的维护变得不必要地困难。如果另一个程序员(或几年后的原始程序员)查看包含这样重新定义函数的代码,她或他将更难理解该函数在做什么。

可能还有更多原因,但我希望这足以阻止使用这种结构。不同的编程语言有不同的特点,作为程序员,有必要去适应它们。 Python中常见的东西在R中可能很尴尬,反之亦然。

在 R 中处理这种标准情况的一种简单且常用的方法是使用library() 来加载包含所请求函数的包的整个命名空间:

library (lubridate)
year(Sys.Date())

但是,应该注意可能的命名空间冲突,尤其是在同时加载多个库的情况下。在不同的包中可以使用相同的名称定义不同的函数。一个众所周知的例子是lag() 函数在dplyrstats 包中的对比实现。 在这种情况下,可以使用双冒号运算符:: 来解析应处理的命名空间。这类似于在“import”的情况下使用“from”,但每次调用函数时都需要这样的规范。

lubridate::year(Sys.Date()) 
#[1] 2016

【讨论】:

  • tidyverse 和 data.table 喜欢具有相同的函数名称。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 2017-06-07
  • 2015-09-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多