如何通过调用命名空间中没有该方法的函数来找到未附加包中的非导入方法?

2024-01-20

R 命名空间充当其关联包中所有函数的直接环境。换句话说,当函数bar()从包装中foo调用另一个函数,R 求值器首先在中搜索另一个函数<environment: namespace:foo>,然后在"imports.foo", <environment: namespace:base>, <environment: R_GlobalEnv>,依此类推,在输入返回的搜索列表中search().

命名空间的一个好处是它们可以使包表现得像更好的公民:未导出的函数<environment: namespace:foo>和功能在imports:foo仅适用于: (a) 中的函数foo; (b) 导入到其他包foo;或(c)通过完全限定的函数调用,例如foo:::bar().

或者直到最近我也是这么想的......

行为

最近的这个问题 https://stackoverflow.com/questions/10939516/data-frame-transformation-gives-different-results-when-same-code-is-run-before-a/10940237#10940237强调了一种情况,其中隐藏在其包的命名空间中的函数仍然通过调用看似不相关的函数找到:

group <- c("C","F","D","B","A","E")
num <- c(12,11,7,7,2,1)
data <- data.frame(group,num)

## Evaluated **before** attaching 'gmodels' package
T1 <- transform(data, group = reorder(group,-num))

## Evaluated **after** attaching 'gmodels
library(gmodels)
T2 <- transform(data, group = reorder(group,-num))

identical(T1, T2) 
# [1] FALSE

其直接原因

@Andrie 回答了最初的问题,指出gmodels从包中导入gdata,其中包括一个函数reorder.factor被分派到第二次调用内transform(). T1不同于T2因为第一个是通过以下方式计算的stats:::reorder.default()第二个由gdata:::reorder.factor().

我的问题

在上面的调用中是如何实现的transform(data, group=reorder(...)),调度机制reorder找到然后分派到gdata:::reorder.factor()?

(答案应包括对范围规则的解释,这些规则是由涉及函数的调用引起的stats and base封装到一个看似隐藏得很好的方法gdata.)


更多可能有用的细节

  1. Neither gdata:::reorder.factor,也不gdata整个包是由显式导入的gmodels。这里有import*中的指令gmodels' 命名空间 file:

    importFrom(MASS, ginv)
    importFrom(gdata, frameApply)
    importFrom(gdata, nobs)
    
  2. 没有方法reorder() or transform() in <environment: namespace:gmodels>,也不在"imports:gmodels":

    ls(getNamespace("gmodels"))
    ls(parent.env(getNamespace("gmodels")))
    
  3. 分离gmodels不恢复reorder()的行为:gdata:::reorder.factor()仍然被派遣:

    detach("package:gmodels")
    T3 <- transform(data, group=reorder(group,-num))
    identical(T3, T2)
    # [1] TRUE
    
  4. reorder.factor()不存储在基础环境中的S3方法列表中:

    grep("reorder", ls(.__S3MethodsTable__.))
    # integer(0)
    

过去几天的 R 聊天线程包含了一些额外的想法。感谢 Andrie、Brian Diggs 和 Gavin Simpson(以及其他人)可以随意编辑或添加可能的提示。这个问题的详细信息。


我不确定我是否正确理解你的问题,但要点是group是字符向量,而data$group是因素。

贴上后gmodels,呼吁reorder(factor) calls gdata:::reorder.factor. so, reorder(factor(group))称之为。

In transform,该函数在第一个参数的环境中计算,所以在T2 <- transform(data, group = reorder(group,-num)), group是因素。

UPDATED

library将导入包附加到加载的命名空间中。

> loadedNamespaces()
 [1] "RCurl"     "base"      "datasets"  "devtools"  "grDevices" "graphics"  "methods"  
 [8] "stats"     "tools"     "utils"    
> library(gmodels) # here, namespace:gdata is loaded
> loadedNamespaces()
 [1] "MASS"      "RCurl"     "base"      "datasets"  "devtools"  "gdata"     "gmodels"  
 [8] "grDevices" "graphics"  "gtools"    "methods"   "stats"     "tools"     "utils"    

以防万一,reorder通用存在于namespace:stats:

> r <- ls(.__S3MethodsTable__., envir = asNamespace("stats"))
> r[grep("reorder", r)]
[1] "reorder"            "reorder.default"    "reorder.dendrogram"

并了解更多详情

的召唤reorder将在两个环境中搜索 S3generics:

see ?UseMethod

首先在调用泛型函数的环境中,然后在定义泛型的环境(通常是名称空间)的注册数据库中。

then, loadNamespace将 S3 函数注册到命名空间。

所以,就你而言,library(gmodels) -> loadNamespace(gdata) -> registerS3Methods(gdata).

之后,您可以通过以下方式找到它:

> methods(reorder)
[1] reorder.default*    reorder.dendrogram* reorder.factor*    

   Non-visible functions are asterisked

然而,作为reorder.factor未附加在您的搜索路径中,您无法直接访问它:

> reorder.factor
Error: object 'reorder.factor' not found

大概这就是整个场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过调用命名空间中没有该方法的函数来找到未附加包中的非导入方法? 的相关文章

  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • 将绘图调用拆分为多个块

    我正在编写一个图的解释 其中我基本上将在第一个块中创建图 然后描述该输出 并在第二个块中添加一个轴 然而 似乎每个块都会强制一个新的绘图环境 因此当我们尝试使用以下命令运行块时会出现错误axis独自的 观察 output html docu
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 如何获得所有大于x且有位置的数字?

    V lt c 1 3 2 4 2 3 1 X lt 3 pos lt V V X pos is 3 3 我需要的是所有 3 个的位置 I need 2 and 6 哪些职位是3 in V Use which pos lt which V 3
  • 所有 x 轴标签未以 45 度显示

    I m having the code as like below But I m not getting all the x axis labels and it is not displaying in 45 degree when I
  • 投资决策:R中的NPV、IRR、PB计算

    我正在尝试计算不同数量项目的净现值 NPV 内部收益率 IRR 和投资回收期 PB 时间 以评估哪个投资项目提供最佳回报 到目前为止 我可以为每个项目单独计算几行代码 但我想做的是 编写一个函数 它接受一个包含许多不同项目及其现金流的矩阵
  • ISO C++ 草案 (n3290) 中的一点:3.4.3.2/1 命名空间成员

    ISO C 草案 n3290 中的一点 3 4 3 2 1 命名空间成员 如果限定 ID 的嵌套名称说明符指定命名空间 在嵌套名称说明符之后指定的名称在中查找 命名空间的范围 如果限定 ID 以 开头 则 在全局命名空间中查找 之后的名称
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 如何绘制具有显着性水平的箱线图?

    前段时间问了一个关于绘制箱线图的问题Link1 https stackoverflow com questions 14604439 plot multiple boxplot in one graph 我有一些包含 3 个不同组 或标签
  • Shiny:动态数据框构建; renderUI、观察、reactiveValues

    我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现 但我很难理解何时使用 renderUI 带有 uiOutput 而不是其他功能 包括观察 反应 反应值甚至条件面板 我想构建一个完全交互式的数据框架 其中每个
  • 如何使用 tidymodels 和工作流集在同一数据集上拟合多个不同的线性模型

    我想评估同一数据集上多个 主要是 线性回归模型的性能 我想也许使用tidymodels包连同workflowsets workflow set 可能会起作用 我按照这个例子here https workflowsets tidymodels
  • 如何使用 dplyr 独立过滤每列的行

    我有以下内容 library tidyverse df lt tibble tribble gene colB colC a 1 2 b 2 3 c 3 4 d 1 1 df gt A tibble 4 x 3 gt gene colB c

随机推荐