RMarkdown的SQL代码块运行knitr时如何提示用户输入数据库连接用户名
核心原因说明
knitr编译时默认运行在非交互式环境下,readLines方法需要读取交互式输入流,因此无法正常触发。
可行解决方案
方案1:使用RMarkdown params实现编译前输入
你之前对params的使用认知存在偏差,params支持编译时弹出交互窗口让用户手动输入参数值,无需提前在脚本中写死用户名,配置步骤如下:
- 在文档开头的YAML头部定义参数:
--- title: "数据库查询文档" output: html_document params: db_username: label: "数据库用户名" value: "" input: text ---
- 在SQL代码块的连接配置中直接调用参数即可:
-- {sql connection=DBI::dbConnect(RMySQL::MySQL(), user=params$db_username, host="数据库地址", dbname="目标库名")} SELECT * FROM 测试表 LIMIT 10;
编译时点击RStudio的Knit with Params选项,就会弹出输入框让运行脚本的用户填写用户名。
方案2:RStudio环境下弹窗输入
如果仅在RStudio环境中运行脚本,可以用rstudioapi包的弹窗输入方法,编译时也能正常触发:
- 先在SQL代码块前添加R代码块获取用户名并建立连接:
library(rstudioapi) library(DBI) # 弹出输入框获取用户名 db_user <- askForPassword(prompt = "请输入数据库用户名") # 建立数据库连接,可同时增加密码输入提示 con <- dbConnect(RMySQL::MySQL(), user = db_user, host = "数据库地址", dbname = "目标库名", password = askForPassword(prompt = "请输入数据库密码") )
- 后续SQL代码块直接复用已创建的连接:
-- {sql connection=con} SELECT * FROM 测试表 LIMIT 10;
内容的提问来源于stack exchange,提问作者S31
相关产品推荐
相关产品推荐

