我正在尝试找出是否有一种方法可以将参数传递给连接到 RMarkdown 中 BigQuery 的
sql
块:
```{r setup}
library(bigrquery)
bq_auth(path = "access_token.json")
db <- dbConnect(
bigquery(),
dataset = 'my_data',
project = 'my-project',
use_legacy_sql = FALSE
)
parameter_value = 10L
```
```{sql, echo=FALSE, connection=db, output.var="x}
SELECT @parameter_value
```
```{r}
print(x)
# I want to see 10 here.
```
请参阅此处的 BigQuery 参数化查询文档 - https://cloud.google.com/bigquery/docs/parameterized-queries
更新1
虽然
?parameter_value
注入似乎对于标量工作得很好,但它不适用于向量,例如:
```{r}
parameter_value = c(10L, 20L)
```
```{sql, echo=FALSE, connection=db, output.var="x}
SELECT UNNEST(?parameter_value)
```
将会失败:
vapply(values, function(x) dbQuoteLiteral(conn, x), character(1)) 中的错误:值的长度必须为 1,但 FUN(X[1]) 结果的长度为 2
带有标量的事件不使用 BigQuery 引擎来参数化查询。
更新2
我认为现在不可能做到这一点,因为一些 DBI API 没有在
bigrquery
包中实现,我已经为此提出了 issue。还有knitr
包这里
更新3
现在可以在 sql 块中使用
params
参数。
您可以使用
?
在sql块中插入R变量,请参阅在查询中使用R变量
```{sql connection=db,output.vars="x"}
SELECT ?parameter_value
```
print(x)
<int>
10
为了澄清一下,你正在使用 r 块,对吗?根据这个例子这是可能的。
```{r}
library(DBI)
db = dbConnect(RSQLite::SQLite(), dbname = "sql.sqlite")
```
```{sql, connection=db}
SELECT * FROM trials
```
我不确定
bigquery
,但这适用于 PostgreSQL。
您需要 glue::glue_sql()
来传递一些参数。
讨论这里
```{r }
parameter_value <- c(10L, 20L)
parameter_value = glue::glue_sql("{parameter_value*}", .con = wcon)
```
```{sql, connection=wcon, output.var="x"}
select * from t
where t.price in (?parameter_value)
limit 10
```