如何在未加载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
相关产品推荐
相关产品推荐

