R data.table 在导出函数中中断

2024-04-02

我在让 data.table 在 roxygen2 导出函数中工作时遇到问题。

这是一个名为 foo.R (位于我的包的 R 目录中)的文件中的一个简单的假函数,它使用 data.table:

#' Data.table test function
#' @export
foo <- function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}

如果我将此函数复制并粘贴到 R 中,则该函数可以正常工作:

> foo <- function() {
+   m <- data.table(c1 = c(1,2,3))
+   print(is.data.table(m))
+   m[,sum(c1)]
+ }
> foo()
[1] TRUE
[1] 6

但如果我只是加载导出的函数,R 会认为 data.table 是一个 data.frame 并中断:

> rm(foo)
> load_all()
Loading test_package
> foo
function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found

这是怎么回事?

UPDATE

感谢@GSee 的帮助。看来这实际上是一个开发工具问题。查看下面的交互式命令行代码。

加载test_package库后,foo正确运行:

> foo
function ()
{
    m <- data.table(c1 = c(1, 2, 3))
    print(is.data.table(m))
    m[, sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
[1] 6

Running load_all()刹车食物:

> load_all()
Loading test_package
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found

Somehow source('R/foo.R')恢复 foo 功能:

> source('R/foo.R')
> foo
function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6

以及未来的电话load_all()不要打破foo again:

> load_all()
Loading test_package
> foo
function() {
  m <- data.table(c1 = c(1,2,3))
  print(is.data.table(m))
  m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6

另外,我更新到 devtools 1.5 并尝试添加.datatable.aware=TRUE,但这似乎没有做任何事情。


正如@GSee(在评论中)指出的那样,这个问题似乎是这个问题 https://github.com/hadley/devtools/issues/192 still.

为了查明包裹是否数据表感知, data.table调用函数cedta(),即:

> data.table:::cedta
function (n = 2L) 
{
    te = topenv(parent.frame(n))
    if (!isNamespace(te)) 
        return(TRUE)
    nsname = getNamespaceName(te)
    ans = nsname == "data.table" || "data.table" %chin% names(getNamespaceImports(te)) || 
        "data.table" %chin% tryCatch(get(".Depends", paste("package", 
            nsname, sep = ":"), inherits = FALSE), error = function(e) NULL) || 
        (nsname == "utils" && exists("debugger.look", parent.frame(n + 
            1L))) || nsname %chin% cedta.override || identical(TRUE, 
        tryCatch(get(".datatable.aware", asNamespace(nsname), 
            inherits = FALSE), error = function(e) NULL))
    if (!ans && getOption("datatable.verbose")) 
        cat("cedta decided '", nsname, "' wasn't data.table aware\n", 
            sep = "")
    ans
}
<bytecode: 0x7ff67b9ca190>
<environment: namespace:data.table>

这里的相关检查是:

"data.table" %chin% get(".Depends", paste("package", nsname, sep=":"), inherits=FALSE)

当一个包depends on data.table,上面的命令应该返回TRUE- 也就是说,如果您通过安装该软件包R CMD INSTALL然后加载包。这是因为,当您加载包时,R 默认情况下也会在命名空间中创建一个“.Depends”变量。如果你这样做:

ls("package:test", all=TRUE)
# [1] ".Depends" "foo"     

然而,当你这样做时devtools:::load_all(),这个变量好像没有设置。

# new session + set path to package's dir
devtools:::load_all()
ls("package:test", all=TRUE)
# [1] "foo"

So, cedta()不知道这个包确实depends on data.table。但是,当您手动设置.datatable.aware=TRUE,行:

identical(TRUE, get(".datatable.aware", asNamespace(nsname), inherits = FALSE))

被执行,这将返回 TRUE,从而解决这个问题。但事实是devtools没有放置.Depends包的命名空间中的变量仍然存在。

总而言之,这确实是not一个问题data.table.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R data.table 在导出函数中中断 的相关文章

随机推荐

  • 如何修复 Windows Phone 8 Phonegap 应用程序的方向?

    有谁知道如何修复 Windows Phone 8 Phonegap 应用程序中的方向 我希望该应用程序仅支持纵向 接受的答案不正确 正确答案是 打开 主页 xaml 并将其更改为您想要的方向 minie 是纵向 SupportedOrien
  • 为什么 int[] a = new int[0];允许吗?

    有没有理由 int myArray new int 0 编译 这样的表达有什么用处吗 myArray 0 1 gives java lang ArrayIndexOutOfBoundsException if myArray null Sy
  • 使用 WebtestClient 测试 MultipartFile

    我正在为我的控制器类编写单元测试 我正在使用 spring webflux 因此我正在编写测试WebTestClient 这是我的控制器方法 PutMapping updatedocument documentType public Res
  • iPhone SQLite DB 和基于 Web 的 DB 同步和交互建议

    我正在开发我的第二个 iPhone 应用程序 并且正在寻找有关数据库处理的架构建议 这个想法是 1 信息数据库存储在服务器 LAMP 堆栈 上 信息通过 JSON 传递到设备 该部分已实施 用户可以 收藏 数据库中的某个项目 该项目将其存储
  • 使用Intent打开系统应用程序

    我正在尝试制作一个简单的应用程序 当用户从主屏幕或应用程序抽屉单击时 该应用程序会将用户发送到特定的 系统安装的 应用程序 系统设置 日历 浏览器等 例如 我目前尝试在启动应用程序时打开系统设置 就像设置快捷方式一样 可以按照我想要的方式实
  • RStudio 中的永久代码折叠

    我试图确保在保存文件时 在 RStudio 中崩溃的代码 通过 Alt L 在 Shiny 中保持在原位 目前 每次我保存文件时 折叠都会消失 有谁知道如何使折叠永久且独立于保存文件 供参考 我在 Windows 上使用 RStudio 0
  • 使用cmd获取当前用户路径变量而不使用系统路径

    当我使用标准用户 也是管理员 登录时 命令echo PATH 返回系统路径 用户路径 如何只获取用户的路径 例如 当我当前用户的路径是C ruby C java bin系统路径是 SystemRoot system32 SystemRoot
  • 如何使文本浮动在列表项空间的底部?

    如何使文本浮动在列表项空间的底部 我试图使 li 中的所有文本都位于 li 高度的底部 有没有更好的方法来实现这种外观 以及如何超链接 h1 标题 margin 0 padding 0 nav width 100 height 110px
  • 如何在 Internet Explorer 中使用 html 子元素获取 contenteditable div 中的插入符位置

    我正在使用一个 contenteditable div 它可以选择包含内联 html 元素 例如标签 在文本流中 在某些时候 我需要抓取 contenteditable div 的插入符位置 光标位置 插入符 光标 位于 html 子元素之
  • Angular - 错误:spawn cmd ENOENT

    您好 当我生成角度时遇到问题 哟角度 我都完成了 运行 Bower install 和 npm install 来安装所需的依赖项 如果失败 请尝试自己运行该命令 调用角度 路线 调用 Angular Controller C Users
  • 在每个时间间隔更改文本 - React

    我试图在反应的每个时间间隔更改文本 屏幕出现时自动开始 但问题是 给定的时间不被尊重 并且文本以随机时间间隔更改 这是我的代码的一部分 const names tony elias fadi const newName setnewName
  • 在 php 中将 emoji 字符转换为 Unicode 代码点数字

    我正在尝试使用 php 将表情符号转换为 unicode 更多信息 https unicode org emoji charts full emoji list html https unicode org emoji charts ful
  • symfony 2 twig 访问数组 javascript 索引

    是否可以从中获取对象twig数组知道索引是ajavascript多变的 我的控制器 public function showContactModalAction iduser profil em this gt getDoctrine gt
  • 如何在 Electron BrowserWindow 中查看 PDF?

    所以我有这个 Electron 应用程序 在一个 html 文件中 我链接了另一个脚本 该脚本为程序提供了一些实用功能 其中之一是 function openPDF filePath let pdfWindow new electron r
  • Logstash 的 Java 过滤器

    你知道 Logstash 有一个 Ruby 过滤器 它使我能够用 Ruby 编写代码 它通常包含在配置文件中 如下所示 filter ruby code gt 现在我有两个 Jar 文件 我想将它们包含在过滤器中 以便可以根据我在这些 Ja
  • c++0x 中用户定义文字的重载规则

    我对超载规则有点困惑 假设有以下文字运算符 unsigned long long operator xx unsigned long long cooked literal int 1 unsigned long long operator
  • stringbuilder 调用中的 Java 字符串连接

    据我所知 StringBuilder 在连接期间不在字符串池中创建临时字符串实例 从而有助于减少内存使用量 但是 如果我这样做会发生什么 StringBuilder sb new StringBuilder bu sb append b u
  • Meteor - 设置文档标题

    有没有办法改变
  • 如何自动测试基于浏览器的应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果它是一个Windows程序 我会使用Auto it http www autoitscript com autoit3 index s
  • R data.table 在导出函数中中断

    我在让 data table 在 roxygen2 导出函数中工作时遇到问题 这是一个名为 foo R 位于我的包的 R 目录中 的文件中的一个简单的假函数 它使用 data table Data table test function e