可以从 R Markdown 中的 SQL 块访问本地数据帧吗

Posted

技术标签:

【中文标题】可以从 R Markdown 中的 SQL 块访问本地数据帧吗【英文标题】:Can a local dataframe be accesses from a SQL chunk in R Markdown 【发布时间】:2021-12-06 21:41:47 【问题描述】:

我已运行 SQL 语句并将结果存储在本地数据框中 称为“测试”,`sql connection=Prod, output.var="test"。

现在,我需要在另一个 R SQL 块中“测试”本地数据帧,这可能吗?


     SELECT COUNT(*) AS 'RecordCount'
         , EMPD
         , Department 

     FROM "test"
     GROUP BY EMPD
         , Department
         

【问题讨论】:

【参考方案1】:

一般不会。您连接的 SQL 数据库服务器对您的 R 会话一无所知,因此无法处理您的 R 数据。

sqldf 包允许您通过创建本地数据库在 R 对象上使用 SQL。如果您使用 SQL 比使用 R 更自如,或者如果您想做一些在 SQL 中比在 R 中更容易的事情,那么这是一个很好的解决方案。

在大多数情况下,运行 SQL 查询并将结果存储在 R 中的目的是在接下来的步骤中使用 R,而不是 SQL。您的示例 SQL 代码可以像这样转换为 dplyr

library(dplyr)
count(test, EMPD, Department, name = "RecordCount")

如果您需要在新 SQL 查询中引用结果,例如与数据库中的另一个表进行联接,最佳解决方案将取决于您的用例、您使用的 SQL 数据库的风格以及结果有多大。您可以使用一个大的 SQL 查询而不是两个小的 SQL 查询,或者将中间结果写入一个临时表。

【讨论】:

我试图翻译一个使用多个“临时”表的大型 SQL Server 语句,但无法从 RStudio 中的 SQL 块中获取数据以写入 SQL Server 临时表。这就是我分离查询并将结果存储在本地作为临时表的原因。一些查询连接来自 SQL 服务器的表和临时表(在我的情况下存储在本地),这就是为什么我有兴趣从 SQL 块访问本地存储的数据帧。不知道为什么 INTO #temp 语句在 SQL 块中似乎没有效果,但在 SQL 服务器中运行时却可以正常工作。 这些都是非常相关的信息,可以很好地包含在新问题中。 “为什么从 R 连接时我的 select into #temp statements 不起作用?”搜索该问题came up with this question 可能会有所帮助。公用表表达式可能是一个很好的解决方法。 是不是因为select into #temp是一个本地临时表,调用连接一关闭就被收割? 大约 10 年前,我记得一个类似的问题,甚至在单个语句中使用临时表也失败了。我认为 Chris Gheen 的 answer here 可能会这样做——它说 RODBC 默认情况下会在执行第一个临时表语句时认为查询已完成,但提供了一个关闭它的选项。 这是一个有趣的前提。我一直认为临时表的生命周期是由 DBMS 规定的,而不是由连接本身规定的。也就是说,如果由于某种原因RODBCDBI/odbc 硬失败,那么临时表仍然会消失,尽管 ODBC 客户端自身无法正确清理。如果RODBC 正在解决这个问题,那么......听起来它可能会干预临时表操作,考虑到有些需要临时表是#-领先,这可能很困难,而其他人则不需要,所以不是总是清楚哪个是哪个。

以上是关于可以从 R Markdown 中的 SQL 块访问本地数据帧吗的主要内容,如果未能解决你的问题,请参考以下文章

在 R markdown 中,如何防止非缓存块的图被单独保存?

如何访问 R 中的嵌套 SQL 表?

注释掉 R Markdown 中的文本(Rmd 文件)

可在 R markdown `asis` 块中反应,不显示循环

R Markdown 无法获取 RStudio 版本 - knit 中的错误消息

The usage of Markdown---代码块