【问题标题】:How to prevent db connection code chunks from evaluating in Rmd?如何防止在 Rmd 中评估 db 连接代码块?
【发布时间】:2021-07-23 17:11:15
【问题描述】:

我有一个用于生成报告的 .RMD 文件。在文档的开头,有一个代码块在远程数据库上执行查询并返回一些数据作为输出(典型的从不同表的连接中选择查询)。正在生成的数据是相当固定的,因为我正在从某个日期间隔检索数据并且我正在执行分析的这个日期间隔没有改变。

每次我在 .RMD 文件中进行与外观相关的更改并编织它时,它都会运行此查询,该查询需要超过 2 分钟才能运行,因为正在返回相当多的数据。我不希望这种情况发生,因为我正在执行分析的基础数据根本没有改变。
我如何确保仅此一个块不会一直评估?我试过把eval = FALSE 但是我收到以下错误:

Error in UseMethod("mutate") : no applicable method for 'mutate' applied to an object of class "function" Calls: <Anonymous> ... withCallingHandlers -> withVisible -> eval -> eval -> %>% -> mutate Execution halted`<br><br>

对于上下文,df 是通过 dbExecuteQuery() 执行查询后返回的数据帧。一旦执行了 eval = FALSE 的块,我就有另一个块对其执行 mutate() 。这就是产生错误的地方。

eval=FALSE 的代码块只是一个通用的 sql 执行代码块。块的内容是这样的:

query <- 'select * from table1 join table2'
query2 <- 'select * from table3'
df1 <- dbGetQuery(conn,query)
df2 <- dbGetQuery(conn,query2)
df < - left_join(df1,df2)

产生错误的下一个代码块是这样的:

df <- df %>% mutate(newcol = is.na(somecol))

我在 Stackoverflow 上找到了一个可以解释我的问题但没有令人满意的解决方案的答案。

SF帖子链接:error knitting flex dashboard rmarkdown dplyr

【问题讨论】:

    标签: r r-markdown knitr


    【解决方案1】:

    我假设,即使您收到错误消息,您也会在 2 分钟标记之前收到它,如果要评估此块需要多长时间,对吧?所以 eval = FALSE 根本不应该是问题。如果您不需要一次又一次地运行查询,我假设您将数据存储在本地?

    由于包冲突,错误消息本身可能会弹出,也许尝试 dplyr::mutate?

    【讨论】:

      【解决方案2】:

      你或许可以试试memoise

      应该是这样的:

      query <- 'select * from table1 join table2'
      query2 <- 'select * from table3'
      my.get.query <- memoise( dbGetQuery )
      df1 <- my.get.query(conn,query)
      df2 <- my.get.query(conn,query2)
      df < - left_join(df1,df2)
      

      这可能行不通,这完全取决于编织的操作方式,是否从新会话开始。

      否则,请编写您自己的函数,将结果缓存到文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2017-12-15
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多