You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在未加载R包时使用get()获取其中的函数?

未加载R包时用get()获取包内函数的方法

背景说明

我们可以使用get()访问当前环境中的函数,示例如下:

get("sum")
# function (..., na.rm = FALSE)  .Primitive("sum")

如果要获取已加载包中的函数,常规做法是先加载包再调用get():

library(data.table)
get("uniqueN")

# function (x, by = if (is.list(x)) seq_along(x) else NULL, na.rm = FALSE) 
# {
#   if (is.null(x)) 
#     return(0L)
#   if (!is.atomic(x) && !is.data.frame(x)) 
#     stop("x must be an atomic vector or data.frames/data.tables")
#   if (is.atomic(x)) {
#     if (is.logical(x)) 
#       return(.Call(CuniqueNlogical, x, na.rm = na.rm))
#     x = as_list(x)
#   }
#   o = forderv(x, by = by, retGrp = TRUE, na.last = if (!na.rm) 
#     FALSE
#     else NA)
#   starts = attr(o, "starts", exact = TRUE)
#   if (!na.rm) {
#     length(starts)
#   }
#   else {
#     sum((if (length(o)) o[starts] else starts) != 0L)
#   }
# }
# <bytecode: 0x5559622e2f60>
#   <environment: namespace:data.table>

但如果尝试直接用字符串形式指定包名加函数名,会触发错误:

get("data.table::uniqueN")
# Error in get("data.table::uniqueN") : 
#   object 'data.table::uniqueN' not found

这是因为未加载的包不会在当前环境生成对应的命名空间环境,无法通过这种方式直接查找。

解决方法

方法1:结合asNamespace()与get()

先通过asNamespace()获取目标包的命名空间环境,再将其传入get()的envir参数:

get("uniqueN", envir = asNamespace("data.table"))

方法2:使用getFromNamespace()

R提供了专门的getFromNamespace()函数,可直接从指定包的命名空间中获取对象,无需提前加载包:

getFromNamespace("uniqueN", ns = "data.table")

以上两种方法都能在不加载包的前提下,成功获取目标函数。


内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:30:17