【问题标题】:Evaluate function within package environment without attaching package在不附加包的情况下评估包环境中的功能
【发布时间】:2018-09-25 22:29:15
【问题描述】:

背景

  • 我想评估一组带有包环境的 R 函数附加此包
  • 我想避免使用 package::

示例

数据

给定样本虚拟数据集:

# Data --------------------------------------------------------------------

tmpCSV <- tempfile(fileext = ".CSV", pattern = "mtcars_data_")
write.csv(x = mtcars[, 1:5], file = tmpCSV, row.names = FALSE)
# Confirm
# readLines(con = tmpCSV)[1]

阅读

library

我可以使用readr 包中提供的read_csv 函数来阅读它。

library(readr)
dta <- read_csv(
    file = tmpCSV,
    col_types = cols(
        mpg = col_double(),
        cyl = col_integer(),
        disp = col_integer(),
        hp = col_integer(),
        drat = col_double()
    )
)

readr::

也可以直接调用readr::函数:

# detach("package:readr", unload=TRUE)
dta <- readr::read_csv(
    file = tmpCSV,
    col_types = readr::cols(
        mpg = readr::col_double(),
        cyl = readr::col_integer(),
        disp = readr::col_integer(),
        hp = readr::col_integer(),
        drat = readr::col_double()
    )
)

问题

我想使用eval/evalq(如果可能的话)获得相同的结果。所需的语法类似于:

eval(expr = read_csv(
    file = tmpCSV,
    col_types = cols(
        mpg = col_double(),
        cyl = col_integer(),
        disp = col_integer(),
        hp = col_integer(),
        drat = col_double()
    )
),
# Naturally, the "" bit does not make sense
envir = "package::readr")

预期错误:

read_csv(file = tmpCSV, col_types = cols(mpg = col_double(), 中的错误:找不到函数 "read_csv"


注意事项

该任务主要涉及访问包函数加载包和直接通过::@调用函数987654337@。概念上的等价物是使用with 函数并引用没有$ 的数据框列:

with(mtcars, t.test(disp ~ am))

更好的例子:

with(mtcars, mpg[cyl == 8  &  disp > 350])

【问题讨论】:

  • 你不能想出一个不需要安装巨大的 BH 包的例子吗?
  • @Roland 是的:with(data = asNamespace("dplyr"), expr = summarise(.data = mtcars, "mean_cyl" = mean(cyl)))

标签: r function namespaces eval packages


【解决方案1】:

只使用with?我不明白你为什么不想使用::

setwd("E:/temp")

tmpCSV <- tempfile(fileext = ".CSV", pattern = "mtcars_data_")
write.csv(x = mtcars[, 1:5], file = tmpCSV, row.names = FALSE)


dta <- readr::read_csv(
  file = tmpCSV,
  col_types = readr::cols(
    mpg = readr::col_double(),
    cyl = readr::col_integer(),
    disp = readr::col_integer(),
    hp = readr::col_integer(),
    drat = readr::col_double()
  )
)

sessionInfo()
#attached base packages:
#  [1] stats     graphics  grDevices datasets  utils     methods   base     

#loaded via a namespace (and not attached):
#[1] readr_1.1.1      compiler_3.4.4   assertthat_0.2.0 R6_2.2.2         cli_1.0.0       
#[6] hms_0.4.2        tools_3.4.4      pillar_1.2.1     rstudioapi_0.7   tibble_1.4.2    
#[11] crayon_1.3.4     Rcpp_0.12.16     utf8_1.1.3       pkgconfig_2.0.1  rlang_0.2.0     
#[16] fortunes_1.5-4 

dtb <- with(asNamespace("readr"), read_csv(
  file = tmpCSV,
  col_types = cols(
    mpg = col_double(),
    cyl = col_integer(),
    disp = col_integer(),
    hp = col_integer(),
    drat = col_double()
  )))
#same happens here

identical(dta, dtb)
#[1] TRUE

【讨论】:

  • 很好的答案,谢谢。我不反对直接使用这样的功能;出于好奇,我对另一种方法很感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2015-02-14
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多