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

从我自己的主机调用注册的knitr引擎,r,knitr,R,Knitr,我希望在knitr中预处理传递给sql引擎的文本,以便它能够处理由我的sql Server工具生成的代码,该工具输出的代码如下所示 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(1

我希望在knitr中预处理传递给sql引擎的文本,以便它能够处理由我的sql Server工具生成的代码,该工具输出的代码如下所示

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函数后,需要将结果组合成单个字符串,例如change

lapplycode,functionc{ 选项$code