Вызов зарегистрированного вязального движка из моего собственного - PullRequest
0 голосов
/ 18 июня 2020

Я хочу предварительно обработать текст, переданный механизму sql в knitr, чтобы он мог обрабатывать код, сгенерированный моим 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)
  })
})
...