我在 RMarkdown 上设置了一个引擎:
knitr::knit_engines$set(mplus = function(options) {
code <- paste(options$code, collapse = "\n")
fileConn<-file("mplus_code.inp")
writeLines(code, fileConn)
close(fileConn)
out <- system2("/opt/mplus/8.10/mplus", "mplus_code.inp")
fileConnOutput <- file("mplus_code.out")
mplusOutput <- readLines(fileConnOutput)
knitr::engine_output(options, code, mplusOutput)
})
我运行如下:
```{cat bcfa, engine.opts = list(file = "assets/code/mplus/mplus_bcfa.inp", lang = "mplus"), name = "mplus_bcfa.inp"}
TITLE: TWO-FACTOR MODEL OF POLITICAL ATTITUDES
DATA:
FILE IS assets/data/BAYESCFA.dat;
VARIABLE:
NAMES ARE X1-X10;
DEFINE: STANDARDIZE X1-X10;
ANALYSIS: ESTIMATOR=BAYES;
PROCESSORS = 10; ! used to increase computational speed
FBITER = 10000; ! over-rides Mplus convergence criterion
MODEL:
CONSERV BY X1* X2 X3 X4 X5;
LIBERAL BY X6* X7 X8 X9 X10;
CONSERV-LIBERAL@1;
! SPECIFICATION OF CROSS-LOADINGS:
CONSERV BY X6-X10*0 (A1-A5);
LIBERAL BY X1-X5*0 (B1-B5);
MODEL PRIORS:
A1-B5 ~ N(0,.01);
OUTPUT: TECH1 TECH8 STAND;
PLOT: TYPE=PLOT2;
```
换句话说,该块将在
assets/code/mplus/mplus_bcfa.inp
文件中写入语法,并以 Mplus 格式突出显示在 xaringan 幻灯片上。
我想调用该块并运行它,生成具有我决定的名称和位置的输出文件。我使用以下块(用于下一张幻灯片)尝试了它,因此它显示了输出:
```{mplus, eval=TRUE, echo=F, ref.label='bcfa', root.dir = "assets/code/mplus"}
我希望这个块在文件夹
mplus_bcfa.out
中创建文件assets/code/mplus
。虽然它并没有这样做,但它只是创建文件 mplus_code.out
(如knitr 引擎配置中所定义)并将其放置在 RMarkdown 文件夹的根目录中。
为了添加更多上下文,我还尝试在引擎选项中定义
input
和 output
:
knitr::knit_engines$set(mplus = function(options) {
code <- paste(options$code, collapse = "\n")
fileConn<-file(options$input)
writeLines(code, fileConn)
close(fileConn)
out <- system2("/opt/mplus/8.10/mplus", options$input)
fileConnOutput <- file(options$output)
mplusOutput <- readLines(fileConnOutput)
knitr::engine_output(options, code, mplusOutput)
})
然后在块选项中调用 then (即
input
和 output
:
```{mplus, eval=TRUE, echo=F, ref.label='bcfa', root.dir = "assets/code/mplus", input = "assets/code/mplus/mplus_bcfa.inp", output = "assets/code/mplus/mplus_bcfa.out"}
```
但是没有成功...
您需要在引擎代码中执行命名/读取/写入。
在这个例子中,我让你的代码块保持不变,除了:
echo=FALSE
添加到第二个代码块。---
title: "Example MPlus Knitr Engine"
date: "2024-05-06"
output:
xaringan::moon_reader:
lib_dir: libs
nature:
highlightStyle: github
highlightLines: true
countIncrementalSlides: false
---
```{r setup, include=FALSE}
knitr::knit_engines$set(mplus = function(options) {
# make a note of the original working directory so we might revert later
old_wd <- getwd()
# set the working directory as per your `root.dir` chunk option
setwd(options$root.dir)
# determine the name of the input file from your `ref.label` chunk option
inp_file <- sprintf("mplus_%s.inp", options$ref.label)
# run MPlus against the input file
system2("C:/Program Files/Mplus Demo/Mpdemo8.exe", inp_file)
# output file will be same name as input but with .out extension
out_file <- sprintf("mplus_%s.out", options$ref.label)
# read from the output file
out <- readLines(out_file)
# revert the working directory
setwd(old_wd)
# return output
knitr::engine_output(options, options$code, out)
})
```
# MPlus Code
```{cat bcfa, engine.opts = list(file = "assets/code/mplus/mplus_bcfa.inp", lang = "mplus"), name = "mplus_bcfa.inp"}
title: Entering data example fixed format using fixed.dat
data:
file is fixed.dat;
format is (2F1.0);
variable:
names are
x y;
missing are blank;
analysis:
type = basic;
```
---
# MPlus Output
```{mplus, ref.label='bcfa', root.dir = "assets/code/mplus", echo = FALSE}
```