【问题标题】:use data.table inside package function [duplicate]在包函数中使用 data.table [重复]
【发布时间】:2017-10-11 04:11:01
【问题描述】:

我正在尝试在包中的函数内使用 data.table。

combine_tot <- function(x){
    nms <- colnames(x)
    colnames(x) <- c('person', 'texts')
    x <- data.table::data.table(x)

    exp <- parse(text='list(text = paste(texts, collapse = " "))')[[1]]
    out <- x[, eval(exp),
        by = list(person, 'new' = data.table::rleid(person))][,
        'new' := NULL][]
    data.table::setnames(out, nms)
    out
}

这是一个演示这个的虚拟包:https://github.com/trinker/testdt

如果我是交互式的,则该功能可以正常工作。如果我在包中使用它,则会收到以下错误:

Error in paste(texts, collapse = " ") : object 'texts' not found 

但如果我以交互方式运行它,我会按预期得到以下结果:

library(data.table)
x <- data.frame(a= c('a', 'a', 's', 'f', 'd', 'a', 's', 's'), b = state.name[1:8])
combine_tot(x)

   a                    b
1: a       Alabama Alaska
2: s              Arizona
3: f             Arkansas
4: d           California
5: a             Colorado
6: s Connecticut Delaware

我已经在其他类似情况下使用eval(parse 使用过data.table,但我无法完成这项工作。我做错了什么?

【问题讨论】:

  • 猜测一下,您是否尝试过使用out &lt;- x[, eval(exp, envir = environment()),?范围界定似乎存在问题。
  • 当您“交互式运行”时,您正在加载 data.table,因此可以访问[.data.table,但是当您在自己的包中运行它时,您不会加载/导入 data.table,所以你得到的是[.data.frame...至少这对我来说似乎是合理的,作为一个没有制作任何包裹的人。
  • 尝试在函数的第一行添加require(data.table)
  • 在一个包的函数内部,最好不要使用library(data.table)require(data.table)
  • 绝对是骗子

标签: r data.table


【解决方案1】:

这可能是因为我们没有在 'DESCRIPTION' 的 'Depends' 中指定它

包已构建、安装并能够运行示例

注意:Author:Maintainer: 字段在“描述”文件中不为空

注意2:使用相同的函数combine_tot,没有额外的变化

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多