Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 包包装“odbc”不适用于全局连接_R_Package_Devtools - Fatal编程技术网

R 包包装“odbc”不适用于全局连接

R 包包装“odbc”不适用于全局连接,r,package,devtools,R,Package,Devtools,我有一个包pkg,它围绕odbc包来简化我的生活。该包由单个代码文件sql\u con.R组成: 构建包再次成功 然后,我运行以下测试: library(pkg) pkg::pkg # <environment: 0x000001a9dbcf8f88> pkg::pkg$con # An object of class "Microsoft SQL Server" # [a bunch of attributes...] pkg::getQuery("SELECT * FROM

我有一个包pkg,它围绕odbc包来简化我的生活。该包由单个代码文件sql\u con.R组成:

构建包再次成功

然后,我运行以下测试:

library(pkg)

pkg::pkg
# <environment: 0x000001a9dbcf8f88>

pkg::pkg$con
# An object of class "Microsoft SQL Server"
# [a bunch of attributes...]

pkg::getQuery("SELECT * FROM Foo")
# Error in (function (classes, fdef, mtable)  : 
#   unable to find an inherited method for function ‘dbGetQuery’ for signature ‘"Microsoft SQL Server", "character"’
删除环境的使用不会改变任何东西。我已经将DESCRIPTION设置为使用Depends:而不是common Imports:来修复此问题,第一个版本使用Imports:,并且可以在命名空间中使用importMethodsFrom正确导入函数

我注意到,odbc仅在使用此类参数实际调用dbGetQuery时才使用Microsoft SQL Server签名创建继承函数。但我看不出这有什么关系


是否有任何原因使连接成为全局连接会破坏包?

我现在没有ODBC连接, 但我想我知道问题是什么

我遇到, 我建议你通读一遍,因为你可能需要类似的东西来清理你的连接, 但关键是:

请注意,在安装软件包时,R将运行 包,并且仅将代码结果存储在已安装的 包裹因此,如果在函数外部创建对象 包,则只有对象将存储在包中,而不是 创建它的代码。当您选择时,对象将被简单地加载 加载包,但不会重新创建

这意味着您的包正在尝试使用已序列化并随后反序列化的DB连接, 这不可能奏效。 如果你想完全靠你自己管理, 您可能需要以下内容:

conn_provider <- with(new.env(), {
    conn <- NULL

    function() {
        if (is.null(conn)) {
            conn <<- DBI::dbConnect(your_details)
        }

        conn
    }
})
同样,对于所有其他函数。 我觉得这样,, 包中对DBI泛型的调用始终可以分派到任何基于DBI的包定义的特定方法,
不仅仅是odbc指令。

可能是相关的。@Roland,将Imports:更改为Dependes:in DESCRIPTION,并将ImportToDBC和/或importFromodbc、dbGetQuery、dbConnect添加到命名空间中没有任何效果。Roland引用的文本正下方的链接中的信息清楚地表明,指令是ImportClassFrom和ImportMethodFrom。@Alexis,是的。但是,在调用getQuery时,从ODBC、dbGetQuery、dbConnect添加importMethodsFromodbc会引发相同的错误。您使用的是哪种操作系统?您是否按照?成功!中的描述配置了所有内容!事实上,将环境中的全局变量更改为这个conn_提供程序生成器就成功了。实际上,我不必将odbc::更改为DBI::也不必将DBI添加到我的命名空间中,而roxygen2就是这样做的。是的,我当然打算使用roxygen。@Wasabi您现在不需要更改为DBI::但是如果您想使用非ODBC驱动程序,您必须这样做。这就是我为什么建议的原因。
library(pkg)

pkg::pkg
# <environment: 0x000001a9dbcf8f88>

pkg::pkg$con
# An object of class "Microsoft SQL Server"
# [a bunch of attributes...]

pkg::getQuery("SELECT * FROM Foo")
# Error in (function (classes, fdef, mtable)  : 
#   unable to find an inherited method for function ‘dbGetQuery’ for signature ‘"Microsoft SQL Server", "character"’
conn_provider <- with(new.env(), {
    conn <- NULL

    function() {
        if (is.null(conn)) {
            conn <<- DBI::dbConnect(your_details)
        }

        conn
    }
})
#' @importFrom DBI dbGetQuery
#' @importMethodsFrom odbc dbGetQuery
#'
getQuery <- function(sql) {
  DBI::dbGetQuery(conn_provider(), sql)
}