【问题标题】:data.table function works in script but not in packagedata.table 函数在脚本中有效,但在包中无效
【发布时间】:2014-08-14 08:16:33
【问题描述】:

我有一个函数可以从 data.table 中删除空列,并将其包含在一个包中。

当我加载函数时它以某种方式工作,但当我从包中调用它时却不行。 问题:当我从包中调用它时,为什么这个函数不运行?

包中的任何函数中都没有 require(data.table) 或 library(data.table)。描述文件包含:导入:data.table。 所以Using data.table package inside my own package很满意。

library(data.table)
df = data.table(a = c(1,2,3), b = c(NA, NA, NA), c = c(4,5,6))
library(cr360)

remove.emptycols(df) # from package
Error in .subset(x, j) : invalid subscript type 'list'

# now open function from mypackage and run again:
# source("./mypackage/R/fun_remove_emptycols.R")
remove.emptycols(df)
   a c
1: 1 4
2: 2 5
3: 3 6

功能:

#' Remove empty columns
#' 
#' Counts the number of NA values in the columns and counts the number of rows.
#' @param df
#' @return df data.table with empty columns removed.
#' @export
#' 
#' 
remove.emptycols = function(df) {

count.colNA = df[,lapply(.SD, function(x) sum(is.na(x)))] 
df = df[,which(count.colNA != nrow(df)),with = FALSE]  

return(df)
}

【问题讨论】:

  • 奇怪。您是否使用新的说明文件重建了您的包并重新安装了您的包?
  • 我做到了。还尝试了模块包 [更多类似 python 的模块方法替代包],结果相同。构建并重新加载包。构建并重新启动 R:相同的结果。我现在只是在一个新的命名空间中加载函数:utils = new.env(), source(utils$remove.emptycols = function ....这很好。
  • 哦。请粘贴sessionInfo()packageVersion("data.table") 的结果,你的包有NAMESPACE 文件吗?
  • 长输出,所以这里是文件:copy.com/4hN8Mm1LyrpHcopy.com/q7SQFqLqjfhm
  • 似乎有一个换行符:Imports: \n data.table。删除它,使该字段为一行,重新构建,重新安装并重试。

标签: r data.table


【解决方案1】:

正文

import(data.table)

需要在 NAMESPACE 文件中以及 data.table 需要在DESCRIPTION 字段的Imports: 字段中。我已经编辑了链接的问题并更新了 FAQ 6.9。
Using data.table package inside my own package

另外,在 RStudio 中,请注意“使用 Roxygen 构建 NAMESPACE 文件”选项,请参阅:
Does roxygen2 automatically write NAMESPACE directives for "Imports:" packages?


为后代保留以前的红鲱鱼......

不确定,但您的包裹的说明包含:

...
Version: 1.0
Date: 2014-06-23
Imports:
    data.table
Author: Henk
Description: utility functions
...

尝试删除换行符,而不是这样:

...
Version: 1.0
Date: 2014-06-23
Imports: data.table
Author: Henk
Description: utility functions
...

【讨论】:

  • 试过了,不知何故,它在构建包后以换行符返回。所以我完全保存为第二个代码块,然后在包构建后它完全出现在第一个代码块中。
  • 知道了。如果我将“Imports:data.table”替换为“Depends:data.table”,那么整个事情都会奏效。它仍然与换行符一起保存,但功能按预期工作。感谢您为我指明正确的方向!
  • 很好,但你不应该依赖,应该可以使用其他包可以执行的 Imports。奇怪的!也许尝试Imports: methods, data.table 只是为了 i)查看仅导入 1 个包时是否是边缘情况,但也 ii)确保重新安装确实有效。我有时会做出“无效”的推论,实际上另一个 R 进程正在阻塞或没有重新启动新的 xterm,或者僵尸进程意味着之前安装的包文件仍在加载。
  • 现在我突然收到错误消息,找不到DESCRIPTION文件,而它就在我眼前,在正确的目录中。我已将所有脚本迁移到一个新的包项目,一切正常。尽管如此,这花费了我很多时间,以至于我只是将脚本加载到新环境中,而不是采用打包方式。这是一个 Heisenbug 生成器!
  • 确实是的 - 一切都使用 devtools/roxygen 完成。我已经关闭了配置下的选项:“使用 Roxygen 构建 NAMESPACE 文件”。现在,如果我在 NAMESPACE 中添加 import(data.table) 它仍然存在。如果我有 Imports: data.table in DESCRIPTION 和 import: data.table in NAMESPACE 一切正常。到目前为止的结论:要么取决于:DESCRIPTION 中的 data.table, 要么 关闭 roxygen 的 NAMESPACE 并包括 Imports:data.table 在DESCRIPTION import(data.table) 在命名空间。到达那里!噗……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多