【问题标题】:How can I get Emacs ess to recognize a query string (within quotes) as code?如何让 Emacs ess 将查询字符串(引号内)识别为代码?
【发布时间】:2011-02-17 20:52:57
【问题描述】:

背景

我有一个函数dbquery,它简化了从 R 中查询 MySQL 数据库的过程。

dbquery <- function(querystring) {
  dvr <- dbDriver("MySQL")
  con <- dbConnect(dvr, group = "databasename")
  q <- dbSendQuery(con, querystring)
  data <- fetch(q, n = -1)
  return(data)
}    

这样我可以发送:

dbquery(querystring = "select field_1, field_2, field_3 
                       from table_a join table_b on this = that 
                       join table_c on that = something 
                       where field_4 in (1,2,3);"

但是,变量querystring 必须包含在引号内。这使得 Emacs ESS 不会像在 SQL 模式下那样很好地缩进我的查询 - 或者甚至不会像在 ESS-R 模式下没有引号时那样缩进。

问题

是否可以让 ESS 做到这一点?也许通过编写函数以便它接受不带引号的查询(并在函数中添加引号),或者可能向 .emacs 或 ess.el 添加一些内容?

【问题讨论】:

  • 应该q &lt;- dbSendQuery(con, query) 真的是q &lt;- dbSendQuery(con, querystring) 吗?
  • @JD-Long 是的,感谢您指出这一点
  • 您的问题是因为您有复杂的多行查询字符串吗?因为通过这个简短的例子,你给出的肯定不是问题。
  • @Spacedman 我把这个琐碎的例子改成了不那么琐碎的东西来澄清这一点

标签: r emacs ess


【解决方案1】:

我想你想要什么MMM Mode。顾名思义:MultiMajorMode Mode 允许在同一个缓冲区的不同区域拥有多种模式。

我建议您查看http://www.emacswiki.org/emacs/HtmlModeDeluxe 中的示例,因为它们可能会让您知道如何在您的情况下执行此操作(您可能希望在代码中围绕 sql 添加一些注释,以便 MMM 可以找到 sql代码)。

我猜你必须做这样的事情(未经测试):

(require 'mmm-mode)
(mmm-add-group
     'sql-in-ess
     '(
             (sql-query
                    :submode sql-mode
                    :face WHATEVERYOUWANT
                    :front "#SQL_QUERY>"
                    :back "#<SQL_QUERY"))
(add-to-list 'mmm-mode-ext-classes-alist '(ess-mode nil sql-in-ess))

但是,这可能有点过头了,除非您经常在 R 代码中使用复杂的 sql 查询。

【讨论】:

  • 如果我是你,我会把dbSendQuery(" 放在前面,") 放在后面。或者那样……
【解决方案2】:

我不知道有什么方法可以做到这一点。似乎您在问,“我可以让 Emacs 同时处于两种模式吗?(即 ESS 和 SQL)”我认为答案是“不”,但我希望有人能来向我们展示一个可以证明我的 cleaver hack错误的!

【讨论】:

  • @jd-long 我想这将是一个答案,但它也可以让 ess 忽略引号,或者编写函数以便它可以采用不带引号的字符串(!?)
  • 这是可以管理的。我在这里问了一个类似的问题:goo.gl/SoX4q 当我准备用 Jeff 的 RApache 模块和 brew 包做一些 webdev 的东西时。 brew 使用类似 ASP(或 PHP)的标签 &lt;% %&gt;,所以我想在 R 和 HTML 语法之间切换。无论如何,我发现我不需要brew,因为整个RApache 的工作就像sys.source 的魅力。但是 MMM 是完成此类任务的首选武器……
  • ...而且,顺便说一句,这种“标记模式切换”嵌入在 ESS 的 Sweave 模式中。它不仅易于管理,而且您可能每天都在使用它(在编写报告时)。 =)
  • 我明天要删除这个答案。永远保留我的愚蠢是没有意义的。但我会在晚上穿上我的耻辱。
【解决方案3】:

一个简单的替代方法是使用粘贴,每行一个单独的字符串:

dbquery(querystring = paste("select field_1, field_2, field_3", 
                      "from table_a join table_b on this = that", 
                      "join table_c on that = something", 
                      "where field_4 in (1,2,3);"))

也许有点笨拙,但它在实践中有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多