如何更改每个块中 Rmarkdown 中引擎生成的文件的位置和名称

问题描述 投票:0回答:1

我在 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"}
```

但是没有成功...

r r-markdown knitr
1个回答
0
投票

您需要在引擎代码中执行命名/读取/写入。

在这个例子中,我让你的代码块保持不变,除了:

  1. 将 MPlus 代码更改为更简单的代码(并指向我制作的输入文件)
  2. 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}
```
© www.soinside.com 2019 - 2024. All rights reserved.