2016-09-17 68 views
8

Jestem instruktorem, który chce wykonać zadanie domowe i instrukcję rozwiązania zadania domowego z tego samego pliku Rmarkdown, zmieniając parametr dokumentu, który utworzyłem o nazwie soln. Kiedy soln=FALSE generowany jest dokument przydziału, a gdy soln=TRUE generowany jest przewodnik po zadaniach domowych. Mogę kontrolować wykonanie fragmentu kodu R przy użyciu parametru dokumentu, ale chciałbym również warunkowego włączenia tekstu ze znacznikami.Czy istnieje sposób na wykonanie warunkowego wykonania fragmentu przecinku w Rmarkdown?

Moje bieżące obejście jest brzydki:

--- 
title: "Homework" 
output: word_document 
params: 
    soln: TRUE 
--- 
Fit the linear regression model $Y \sim X$ with the following data.  
Interpret the coefficient estimates. 
```{r promptchunk, include = TRUE, echo = TRUE} 
# R code I want to show in the question prompt goes here 
# This executes in both assignment and solution versions 
set.seed(123) 
X <- c(1, 1, 0, 0) 
Y <- rnorm(4) 
``` 
```{r, include = params$soln, echo = FALSE, results = "asis"} 
cat(" 
**ANSWER** 
") 
``` 
```{r, echo = params$soln, include = params$soln, eval = params$soln} 
# R code corresponding to the solution 
fit1 <- lm(Y ~ X) 
summary(fit1) 
``` 
```{r, include = params$soln, echo = FALSE, eval = params$soln, results = "asis"} 
cat(" 
The interpretation of the intercept is.... 
Our estimate $\\hat{\\beta}_0$ is ",coef(fit1)[1],". 
The estimated X coefficient $\\hat{\\beta}_1$ is ",coef(fit1)[2]," 
This can be interpreted as.... 

You can imagine that for more difficult questions, this section could be quite long. 
") 
``` 

Co chciałbym zrobić, to wymienić klocki zawierające cat funkcje z czymś bardziej elegancki i czytelny dla osoby pisanie instrukcji rozwiązań. Moje obecne podejście działa dla mnie wystarczająco, ale nie jest to coś, o co mógłbym poprosić moich instruktorów, ponieważ tak nieprzyjemne jest pisanie rozwiązań wewnątrz funkcji cat. (Jako użytkownik LaTeX denerwuje również konieczność podwójnego ukośnika we wszystkich poleceniach matematycznych.)

Czy jest jeszcze inny sposób na zrobienie tego?

+0

Mówisz, że aktualna wersja „działa”, ale chcesz coś łatwiejsze do zrozumienia i utrzymania? Czy możesz dodać przykład prawdziwego pytania, które chciałbyś zadać wraz z rozwiązaniem, abyśmy mogli zorientować się, co należy zrobić w kodzie R, a co jest tylko tekstem? – eipi10

+0

@ eip10, Mam zaktualizowane moje pytanie. Obecna wersja działa, ale przy warunkowej realizacji porcji, która musi być zapakowana w funkcję "cat", jest mniej intuicyjna i trudniejsza do odczytu i zapisu niż typowy Rmarkdown.Próbuję uzyskać instruktorów na pokładzie z odtwarzalnością i ogólnie z Rmattdown, ale nie mogę pokazać im tego bałaganu i oczekuję buy-inu. Myślę, że szukam sposobu na ominięcie R jako silnika do obsługi określonych fragmentów tekstu. – thatssobayesic

+0

Może warunkowo zawierać pliki podczas robienia na drutach? Wydaje się dziwne, że robimy cały tekst wewnątrz bloku kodu. Może przyjrzyj się książkom i/lub notatkom. – Elin

Odpowiedz

10

Zamiast cat wydrukować rozwiązanie od wewnątrz fragmentu kodu R, można napisać rozwiązanie jak zwykle będzie w (czyli ze zwykłym połączeniem tekstu, latex i kawałkami kodu R) i zastosowania parametr soln, aby skomentować tę sekcję, gdy nie chcesz uwzględniać rozwiązania w ostatecznym dokumencie.

W próbce dokumencie poniżej, jeśli parametr soln jest FALSE, to linia r if(!params$soln) {"\\begin{comment}"} wstawia \begin{comment} skomentować z roztworu (przy czym dopasowanie kod na końcu wstawiania \end{comment}). Wprowadziłem też wszystko z dwiema kartami, tak aby numery pytań były sformatowane za pomocą wiszącego wcięcia. (Jeśli podoba ci się ten format, nie musisz wpisywać podwójnej karty dla każdego nowego akapitu lub fragmentu.) Jeśli zrobisz to dla jednej linii, to po każdym kolejnym naciśnięciu klawisza Enter, nowa linia zostanie automatycznie sformatowana z podwójnej karcie. Albo, wystarczy wpisać cały tekst i kod dla danego pytania, a kiedy skończysz, zaznacz to wszystko i rodzaju tab dwukrotnie).

--- 
title: "Homework" 
output: word_document 
header-includes: 
    - \usepackage{comment} 
params: 
    soln: TRUE 
--- 

1. Fit the linear regression model $Y \sim X$ with the following data. Interpret the coefficient estimates. 

    ```{r promptchunk, echo = TRUE} 
    set.seed(123) 
    X <- c(1, 1, 0, 0) 
    Y <- rnorm(4) 
    ``` 

`r if(!params$soln) {"\\begin{comment}"}` 

    **Solution:** 

    Run the following R code to fit the linear regression model: 
    ```{r, include = params$soln, echo = TRUE, results = "asis"} 
    fit1 = lm(Y ~ X) 
    ``` 

    To see a summary of the regression results, run the following code and review the output: 

    ```{r, include = params$soln, echo=TRUE} 
    summary(fit1) 
    ``` 
    The interpretation of the intercept is.... 

    Our estimate $\hat{\beta}_0$ is `r round(coef(fit1)[1], 2)`. 

    The estimated X coefficient $\hat{\beta}_1$ is `r round(coef(fit1)[2], 2)`. 

    This can be interpreted as.... 

`r if(!params$soln) {"\\end{comment}"}` 

Ponadto, zamiast na drutach plik powyżej interaktywnie, można renderować obie wersje, uruchamiając funkcję render w oddzielnym skrypcie R. Na przykład, zakładając, że powyższy plik jest nazywany hw.Rmd otworzyć oddzielny plik skryptu R i uruchom następujące:

for (i in c(TRUE, FALSE)) { 
    rmarkdown::render("hw.Rmd", 
        params = list(soln = i), 
        output_file=ifelse(i, "Solutions.doc", "Homework.doc")) 
} 

Poniżej jest co Solutions.doc wygląda. Homework.doc jest podobna, z wyjątkiem wszystko z pogrubionym słowem Solution: naprzód jest wykluczone:

enter image description here

+0

Jestem zszokowany, że możesz dołączyć nagłówki LaTeXa do pliku Markdown, który wyprowadza do Worda. To bardzo pomocne. Widziałem podobne podejścia, ale napisałem je jako nie mające zastosowania w mojej sytuacji z powodu konieczności używania Worda zamiast LaTeXa. To nie jest doskonałe rozwiązanie, ale znacznie przewyższa to, co robiłem. Poczekam jeszcze kilka godzin, żeby zobaczyć, czy pojawią się inne odpowiedzi, ale w przeciwnym razie zaakceptuję to jako odpowiedź. Dzięki. – thatssobayesic