5

私は、knitr、R マークダウン、および pandoc を使用して、秋に教えるコースのビーマー プレゼンテーション/講義を作成しています。プロセスを自動化するための短い R スクリプトを作成しました (「make」ファイルに似ています)。

  1. .Rmdファイルを編む;
  2. pandoc を呼び出して.texファイルを作成します。
  3. ファイルをコンパイルし.texます。
  4. クリーンアップ(不要ファイルの削除)など

1 つの例外 (現在まで) を除いて、すべてが非常にうまく機能しているようです。ニット関数を直接呼び出したときだけうまく「編む」ように見える講義が1つあります。関数を使用makeしてファイルを編成しようとすると.Rmd、特定の R オブジェクトが認識されません。問題を説明するために、以下に短い例を含めました。

単一のコード チャンクを含む「test.Rmd」というファイルを作成しました (以下)。

## Simulation

```{r test, comment=NA, message=FALSE, warning=FALSE}
library(mosaic)
obs<-c(25, 22, 30, 40) # Number of observations in each category
Ais<-c(0.34, 0.101, 0.104, 0.455) # Total Accreage (NUll proportions)
e.count<-Ais*117 # Expected Counts
test.stat<-sum((obs-e.count)^2/(e.count)) #Test statistic = 43.6
rand.dist<-do(1000)*{ 
  # Randomization Distribution
  new.dat<-sample(1:4, replace=TRUE, size=117, prob=Ais) # Sample with Prob = Null pi's
  new.obs<-tally(~new.dat) # Simulated counts
  chi.sq<-sum((new.obs-e.count)^2/e.count) # Simulated test statistic
}
```

このファイルは、knit("test.Rmd") と入力すると問題なく "knit" します。ただし、my.knit<-fucntion(){knit("test.Rmd")} という関数を作成し、この関数を使用して my.knit() と入力して編み物を行うと、エラー メッセージが表示されます。次のような出力:

Error: object 'Ais' not found

別の関数から「knit」を呼び出すと、コードの動作が変わる理由は何ですか?

----------------- 2014 年 5 月 1 日の更新 ----------------------

コードをもう一度テストしました。今回は、Ais を「(」と「)」で囲みました。繰り返しますが、knit("test.Rmd") と入力すると問題なく動作しますが、my.knit() を使用するとうまくいきません。my.knit() と入力したときの .md ファイルの出力は次のとおりです。

## Simulation



```r
library(mosaic)
obs <- c(25, 22, 30, 40)  # Number of observations in each category
(Ais <- c(0.34, 0.101, 0.104, 0.455))  # Total Acreage (NUll proportions)
```

```
[1] 0.340 0.101 0.104 0.455
```

```r
e.count <- Ais * 117  # Expected Counts
test.stat <- sum((obs - e.count)^2/(e.count))  #Test statistic = 43.6
rand.dist <- do(1000) * {
    # Randomization Distribution
    new.dat <- sample(1:4, replace = TRUE, size = 117, prob = Ais)  # Sample with Prob = Null pi's
    new.obs <- tally(~new.dat)  # Simulated counts
    chi.sq <- sum((new.obs - e.count)^2/e.count)  # Simulated test statistic
}
```

```
Error: object 'Ais' not found
```

このアプローチを使用して問題なく他のプレゼンテーションを 10 ほど作成したので、それは奇妙です。Hadley さん、rmarkdown パッケージを調べるように提案してくれてありがとう。私は RStudio を使用していますが、私の目標の多くを達成するための機能が組み込まれていることを認識しています。私が現在設定している方法の利点の 1 つは、すべてのプレゼンテーションに共通のヘッダー ファイル (ラテックス) を使用し、\includeonly を使用して、特定の日の講義に必要な部分を保持できることです。

4

1 に答える 1

4

私の経験によると、この問題はおそらくモザイクパッケージのバグを示しています。私はこのパッケージに詳しくありませんが、次の例は、 Knitrを使用しない最小限の再現可能な例です:

local({
  library(mosaic)
  foo = 5
  do(10) * {
    mean(foo + rnorm(100))
  }
})

以下のようなエラーが発生します。

                                                          result
1  Error in eval(expr, envir, enclos) : object 'foo' not found\n
2  Error in eval(expr, envir, enclos) : object 'foo' not found\n
3  Error in eval(expr, envir, enclos) : object 'foo' not found\n
4  Error in eval(expr, envir, enclos) : object 'foo' not found\n
5  Error in eval(expr, envir, enclos) : object 'foo' not found\n
6  Error in eval(expr, envir, enclos) : object 'foo' not found\n
7  Error in eval(expr, envir, enclos) : object 'foo' not found\n
8  Error in eval(expr, envir, enclos) : object 'foo' not found\n
9  Error in eval(expr, envir, enclos) : object 'foo' not found\n
10 Error in eval(expr, envir, enclos) : object 'foo' not found\n
Warning message:
In mclapply(integer(n), function(...) { :
  all scheduled cores encountered errors in user code

私は、それらが別の環境にあるときに機能すると信じてdo*ます。つまり、グローバルな環境だけで機能するべきではありません。モザイクの開発者がこの問題を修正できる限り、関数は機能するはずです。

誰にも迷惑をかけたくない、または問題が修正されるのを待ちたくない場合はknit()、グローバル環境で確実に呼び出すことができます。

knit(..., envir = globalenv())

デフォルトでは、現時点ではモザイクenvir = parent.frame()では機能しません。

于 2014-05-08T04:56:51.703 に答える