从我自己调用注册的 knitr 引擎

Calling a registered knitr engine from my own

我希望在 knitr 中预处理传递给 sql 引擎的文本,以便它可以处理由我的 SQL 服务器工具生成的代码,它输出的代码看起来像

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE dbo.Person(
 Person int NOT NULL,
 acct varchar(1) NOT NULL,
 Kpl varchar(10) NULL,
 Fac varchar(10) NULL,
 Inst varchar(10) NULL,
 CONSTRAINT PK_Person PRIMARY KEY CLUSTERED 
(
 Person ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY
) ON PRIMARY
GO
ALTER TABLE dbo.Person ADD  DEFAULT (getdate()) FOR _Timestamp
GO
ALTER TABLE dbo.Person ADD  DEFAULT (host_name()) FOR _Hostname
GO
ALTER TABLE dbo.Person ADD  DEFAULT (original_login()) FOR _Username
GO

我目前有以下引擎代码;它似乎适用于编织,但是当我 运行 它使用 RStudio 中的播放按钮时,它似乎没有做任何事情。

knitr::knit_engines$set(tsql = function(options) {
  code <- paste(options$code, collapse = "\n")
  code <- paste(c("\n", code, "\n"), collapse='') # so that GOs at the start or end will be picked up

  code <- strsplit(code, "(?i)\nGO\n", perl = TRUE)[[1]] # split into chunks. R returns a matrix even if you give it a string, so pick the first element
 
  code

  # trim chunks and remove empty
  code <- stri_remove_empty(str_trim(code))
 
  # split chunks into arrays again
  code <- lapply(code, function(c) { return(strsplit(c, "\n")[[1]])})
  sql <- knitr::knit_engines$get('sql')

  # apply sql engine to all chunks
  lapply(code, function(c) {
    options$code <- c
    sql(options)
  })
})

在每个块上应用 sql() 函数后,您需要将结果组合成一个字符串,例如更改

  lapply(code, function(c) {
    options$code <- c
    sql(options)
  })

  res <- lapply(code, function(c) {
    options$code <- c
    sql(options)
  })
  paste(unlist(res), collapse = '\n')