在 R 中从 [包] 导入 [函数]
From [package] import [function] in R
使用 Python 或 R 中的数据,我们经常加载多个包。在某些情况下,两个包(例如 foo
和 bar
)可能每个都包含一些功能(例如 do_stuff
)。
在 Python 中为防止歧义或意外而进行管理的方式如下:
from foo import do_stuff
from bar import other_function # (does not load/import do_stuff() from bar)
在 R 中,我看到的所有代码都只导入了整个包
多个 library(package_name)
语句。我认为这会导致非常难以捕获的错误。例如,参见 Reordering factor gives different results, depending on which packages are loaded。事实上,即使 "there is no masking, since reorder.factor doesn't exist in base."
我希望这个问题的一般答案类似于上面的 from package import function
代码,但事实并非如此。事实上,接受的(也是唯一的)答案只是解释了问题存在的原因(而不是淡化该贡献)。答案的评论中提供了一个解决方法,但该解决方法特定于该特定函数 (reorder
)。
有没有一种通用的方法可以只从 R 中的特定包导入特定函数?这样我就可以慎重而明确地知道我代码中所有函数调用的来源,并确保它们按照我认为的方式进行?
您可以使用 package::function()
构造明确告诉 R 应该将哪个包用于给定函数。您甚至可以使用它来调用尚未加载 library
.
的包中的函数
library(dplyr) # Has a function called filter()
library(plyr) # Also has a filter() function
dplyr::filter(foo)
plyr::filter(bar)
如果您想确保将代码中出现混淆的可能性降至最低,我强烈推荐 conflicted
包,它会强制您明确识别所有不明确的函数调用的包:https://www.tidyverse.org/articles/2018/06/conflicted/
您正在比较两种功能不同的语言。首先,您可以使用 ::
轻松引用包中的函数,例如:
fortunes::fortune()
从 fortunes
包中调用 fortune
函数。
但你也必须小心。因为根据包的构建方式,您最终可能会使用依赖于命名空间中其他(非导出)函数的函数,但由于未加载命名空间而无法找到。我已经 运行 自己使用 mgcv
包中的绘图函数解决了这个问题。这是使用 library()
附加包的原因之一,正如 Andrew Breza 在他的回答中所说明的那样。至少您使用 ::
构造调用的函数将按预期工作(99.9% 的时间)。
但是您link遇到的问题,这并不能解决。问题是 "bad design",因为包作者决定他需要一个 S3 方法来重新排序一个因子,而不是特定于他的包的 class。这样做为整个因子 class 注册了一个 S3 方法,因此改变了在一个因子上调用 reorder()
的每个函数的行为。
由于这个问题是由包开发人员自己造成的,作为用户,除了自己侵入 S3 系统以找到您需要的实际方法之外,您几乎无能为力。
虽然 的答案是正确的,但它不适用于 magrittr
的 %>%
和 %$%
等中缀运算符。 import
包很好用:
import::from(magrittr, "%$%")
但显然可以用于任何函数:
import::from(foo, "do_stuff", "do_other_stuff")
请注意,“[import
] 不适用于 library
。它的命名是为了让 import::from(pkg, fun1, fun2)
这样的调用更具表现力。”有关详细信息,请参阅 https://CRAN.R-project.org/package=import。
从 R 4.0 开始,您还可以使用主 library()
函数执行此操作:
library(dplyr, include.only = c("select", "mutate"))
library(dplyr, exclude = c("filter", "lag"))
基于 wjchulme 的 ,导入包还允许您从自己的脚本中导入函数或其他对象,使 R 具有模块化的感觉,很像 python 模块。
import::from(your_script.R, some_function, SOME_CONSTANT, and_whatever)
参考:https://cran.r-project.org/web/packages/import/vignettes/import.html
使用 Python 或 R 中的数据,我们经常加载多个包。在某些情况下,两个包(例如 foo
和 bar
)可能每个都包含一些功能(例如 do_stuff
)。
在 Python 中为防止歧义或意外而进行管理的方式如下:
from foo import do_stuff
from bar import other_function # (does not load/import do_stuff() from bar)
在 R 中,我看到的所有代码都只导入了整个包
多个 library(package_name)
语句。我认为这会导致非常难以捕获的错误。例如,参见 Reordering factor gives different results, depending on which packages are loaded。事实上,即使 "there is no masking, since reorder.factor doesn't exist in base."
我希望这个问题的一般答案类似于上面的 from package import function
代码,但事实并非如此。事实上,接受的(也是唯一的)答案只是解释了问题存在的原因(而不是淡化该贡献)。答案的评论中提供了一个解决方法,但该解决方法特定于该特定函数 (reorder
)。
有没有一种通用的方法可以只从 R 中的特定包导入特定函数?这样我就可以慎重而明确地知道我代码中所有函数调用的来源,并确保它们按照我认为的方式进行?
您可以使用 package::function()
构造明确告诉 R 应该将哪个包用于给定函数。您甚至可以使用它来调用尚未加载 library
.
library(dplyr) # Has a function called filter()
library(plyr) # Also has a filter() function
dplyr::filter(foo)
plyr::filter(bar)
如果您想确保将代码中出现混淆的可能性降至最低,我强烈推荐 conflicted
包,它会强制您明确识别所有不明确的函数调用的包:https://www.tidyverse.org/articles/2018/06/conflicted/
您正在比较两种功能不同的语言。首先,您可以使用 ::
轻松引用包中的函数,例如:
fortunes::fortune()
从 fortunes
包中调用 fortune
函数。
但你也必须小心。因为根据包的构建方式,您最终可能会使用依赖于命名空间中其他(非导出)函数的函数,但由于未加载命名空间而无法找到。我已经 运行 自己使用 mgcv
包中的绘图函数解决了这个问题。这是使用 library()
附加包的原因之一,正如 Andrew Breza 在他的回答中所说明的那样。至少您使用 ::
构造调用的函数将按预期工作(99.9% 的时间)。
但是您link遇到的问题,这并不能解决。问题是 "bad design",因为包作者决定他需要一个 S3 方法来重新排序一个因子,而不是特定于他的包的 class。这样做为整个因子 class 注册了一个 S3 方法,因此改变了在一个因子上调用 reorder()
的每个函数的行为。
由于这个问题是由包开发人员自己造成的,作为用户,除了自己侵入 S3 系统以找到您需要的实际方法之外,您几乎无能为力。
虽然 magrittr
的 %>%
和 %$%
等中缀运算符。 import
包很好用:
import::from(magrittr, "%$%")
但显然可以用于任何函数:
import::from(foo, "do_stuff", "do_other_stuff")
请注意,“[import
] 不适用于 library
。它的命名是为了让 import::from(pkg, fun1, fun2)
这样的调用更具表现力。”有关详细信息,请参阅 https://CRAN.R-project.org/package=import。
从 R 4.0 开始,您还可以使用主 library()
函数执行此操作:
library(dplyr, include.only = c("select", "mutate"))
library(dplyr, exclude = c("filter", "lag"))
基于 wjchulme 的
import::from(your_script.R, some_function, SOME_CONSTANT, and_whatever)
参考:https://cran.r-project.org/web/packages/import/vignettes/import.html