I have a problem with rendering formulas with variables in R markdown.
Here is the variables that I using (simple example):
```{r, include=FALSE}
series <- c(1, 2, 3, 4)
count <- leng(series)
sum <- sum(series)
sum2 <- sum(series^2)
sq_formula <- TRUE
My problem is to print in Rmd (output = Word) math expression with knitr like:
$$S = \frac{\sum{S}}{n} = \frac{`r sum`}{`r count`} = `r mean(series)`$$
if sq_formula is FALSE, otherwise it should be:
$$S = \frac{\sum{S^2}}{n} = \frac{`r sum2`}{`r count`} = `r sum2 / count`$$
There is a way to write formulas in R chunk and print it by condition, like:
```{r, include=FALSE}
formula1 <- '$$ \\overline{S} = \\frac{\\sum{S}}{n} = \\frac{\\sum{`r sum`}{`r count`}}$$'
formula2 <- '$$ \\overline{S} = \\frac{\\sum{S^2}}{n} = \\frac {\\sum{`r sum2`}}{`r count`}$$'
`r if (sq_formula <- TRUE) {formula1} else {formula2}`
but I can't insert the variables like r sum, r count inside the chunk.
I also tried to handle the problem with sprintf function, but haven't found a way to insert the variables in strings in math notation. So I would be grateful for any help.
What is the problem with sprintf? Can't you do
formula1 <- sprintf(
'$$ \\overline{S} = \\frac{\\sum{S}}{n} = \\frac{\\sum{%s}{%s}}$$',
sum, count
)
Related
I am creating a custom code chunk which rewrites the expressions that a user passes into the code block into valid R code, and then execute the analysis. Aside from the rewriting of the R expression that the user inputs, the goal is for the code chunk to work as a regular code chunk
I then execute the result and store it in a variable, which I am trying to output. I am running into two issues here:
It prints invisible variables
knit_print and engine_output do not seem to work with each other i.e. I want the output such as dataframes to be printed in the table format but I am not able to get it to work.
An example of what I am trying to do would be something like:
```{r}
custom_engine <- function(options) {
c = options$code
pasted <- paste(c, collapse = "\n")
code <- parse(text = pasted)
result = lapply(code, eval, envir = .GlobalEnv)
knit_print(result)
engine_output( options, code = c, out = NULL )
}
knitr::knit_engines$set(mmm = custom_engine)
```
```{r}
speed_data <- data.frame(
speed = rlnorm(100, log(200), 1),
device = sample(c("smartphone", "laptop", "tablet"), 100, TRUE, prob= c(0.1, 0.65, 0.25))
)
median = median(speed_data$speed)
iqr = IQR(speed_data$speed, na.rm=TRUE)
```
```{mmm}
result_analysis <- speed_data %>%
filter(speed < median + 3 * iqr & speed > 10) %>%
filter(device != "smartphone")
result_analysis
```
I would like the code above to print the table once, and in the default knit_print() format that RMarkdown does.
Any suggestions would be much appreciated.
Im trying to inculde the output of the mediate function from mediation package in my RMarkdown (PDF) document. Using summary it gives me the table with the results from the bootstrapping analysis when I knitr the RMarkdown to a PDF document, but:
I don't like the look of the output and wuld like to have a more shiny table.
I can't lable this table with a caption and it's not included in the autmatic nummeration of RMarkdown (and as a consequence I can't reference it in the text).
I tried to use kable or xtabs with the output of the 'mediate` function but it won't work since both functions don't accept the class ("summary.mediate" "mediate") of the output.
This is how the code chunk in my RMarkdown document loks like:
```{r med.y1.z6.z7.c, echo = F, comment = "", strip.white = T, fig.cap="test"}
regDFM <- na.omit(as.data.frame(cbind(Y1, X1, Z1, Z6, Z7)))
regFIT1.C.medY <- lm(Y1 ~ X1+Z1+Z6+Z7+X1:Z1, data = regDFM)
regFIT1.C.medM <- lm(Z7 ~ X1+Z1+Z6+X1:Z1, data = regDFM)
fitMED <- mediation::mediate(regFIT1.C.medM, regFIT1.C.medY,
boot = T, sims = 10, treat="Z6", mediator="Z7")
summary(fitMED)
```
Any help or ideas are very appreciated!
With kable and the elements of the mediate function I finally created a nice RMarkdown > PDF output.
First I created a data.frame using the relevant elements of the mediate function (are the called 'elements'? what would yu call them?). Then just passing the data.frame to kable.
Thanks to #henrik_ibsen for the hint.
Here is my code:
regDFM <- na.omit(as.data.frame(cbind(Y1, X1, Z1, Z6, Z7)))
regFIT1.C.medY <- lm(Y1 ~ X1+Z1+Z6+Z7+X1:Z1, data = regDFM)
regFIT1.C.medM <- lm(Z7 ~ X1+Z1+Z6+X1:Z1, data = regDFM)
fitMED <- mediation::mediate(regFIT1.C.medM, regFIT1.C.medY,
boot = T, sims = 10, treat="Z6", mediator="Z7")
bt_effect <- c("Indirekter Effekt", "Direkter Effekt", "Gesamt Effekt",
"Anteil direkter Effekt")
bt_est <- c(fitMED$d1, fitMED$z1, fitMED$tau.coef, fitMED$n1)
#bt_p <- format.pval(c(fitMED$d1.p, fitMED$z1.p, fitMED$tau.p, fitMED$n1.p))
bt_p <- c(fitMED$d1.p, fitMED$z1.p, fitMED$tau.p, fitMED$n1.p)
bt_stars <- c(stars.pval(fitMED$d1.p), stars.pval(fitMED$z1.p),
stars.pval(fitMED$tau.p), stars.pval(fitMED$n1.p))
bt_DF <- data.frame(row.names = bt_effect, format(bt_est, digits = 2),
format(bt_p, nsmall = 3), bt_stars)
colnames(bt_DF) <- c("Koeffizienten", "p-Werte", "")
kable(bt_DF, booktabs = T, align = "c",
caption = "Bootstraping-Analyse für Mediation") %>%
footnote(general = c("Simulationen: 1000", "Signifikanzniveaus: ∗ p<0.05;
∗∗ p<0.01; ∗∗∗ p<0.001"),
general_title = "Anmerkungen:")
I am using Rmarkdown to produce a report. One of the steps includes a using lapply() with a function that produces a plot in order to produce multiple plots. The function and lapply work well, but I get notation about which element in the list between each plot.
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
#{r pressure, echo=FALSE}
myPlotFun <- function(z){
diamonds %>%
filter(color == !!z) %>%
ggplot(aes(x= carat, y = price))+
geom_point()
}
myList <- c("E","D","H")
lapply(myList, myPlotFun)
and I get:
'## [1]
`##
`## [2]
How do I hide the list notation (e.g. ## [2]) lines in between the plots?
using include = FALSE hides both the plots and the list notation, which is not what I want. I tried warning = FALSE, but that doesn't help.
These numbers are artifacts from lapply. The easiest way to remove them is to use a for loop instead. Otherwise you could create a hook that removes any other output but plots:
```{r}
def <- knitr::knit_hooks$get("output")
knitr::knit_hooks$set(output = function(x, options) {
x <- def(x, options)
ifelse(!is.null(options$suppress), gsub(pattern = "```.*```", "", x), x)
})
```
Just set suppress = T for the relevant chunks.
I'm having trouble writing a cloze question with the exams package in R. I tried to stick close to the boxhist.Rmd example, but something must be wrong. the weird thing is that knitting the Rmd in rstudio displays all components ok - it's just that the html output is blank for the questions? any ideas much appreciated! here is my Rmd file, that I give to exams:::exams2html:
```{r data generation, echo = FALSE, results = "hide"}
m = sample(c(-1,0,5),1)
s = sample(c(1,10,20))
x = rnorm(mean = m, sd = s, n = 100)
write.csv(x, file="sumstats.csv",quote = FALSE,row.names = FALSE)
questions <- rep(list(""), 5)
solutions <- rep(list(""), 5)
explanations <- rep(list(""), 5)
type <- rep(list("num"),5)
questions[[1]] <- "What is the Interquartile range of $x$?"
questions[[2]] <- "What is the Variance of $x$?"
questions[[3]] <- "What is the standard deviation of $x$?"
questions[[4]] <- c("The standard deviation is *always* smaller than the variance.","The standard deviation is *NOT always* smaller than the variance.")
questions[[5]] <- "What is the median of $x$?"
solutions[[1]] <- round(IQR(x),3)
solutions[[2]] <- round(var(x),3)
solutions[[3]] <- round(sd(x) ,3)
solutions[[4]] <- mchoice2string(c(FALSE,TRUE))
solutions[[5]] <- round(median(x),3)
type[[4]] <- "schoice"
explanations[[1]] <- "Function `IQR`"
explanations[[2]] <- "Use `var(x)`"
explanations[[3]] <- "`sd(x)`"
explanations[[4]] <- "$\\sqrt{x}$ is not always smaller than $x$. Try $x=0.5$!"
explanations[[5]] <- "`median(x)`"
```
```{r questionlist, echo = FALSE, results = "asis"}
answerlist(unlist(questions), markup = "markdown")
```
Solution
========
```{r solutionlist, echo = FALSE, results = "asis"}
answerlist(paste(unlist(explanations), ".", sep = ""), markup = "markdown")
```
Meta-information
================
extype: cloze
exsolution: `r paste(solutions, collapse = "|")`
exclozetype: `r paste(type, collapse = "|")`
exname: sumstats
extol: 0.05
You omitted the
Question
========
markup before the question list. Actually, I'm surprised that this works at all, given that R/exams does not know where the question is...
Also, the length of the unlisted questions (6) needs to match the length of the unlisted solutions (currently only 5). This may be necessary in some learning management systems to provide feedback on the individual sub-items.
I am currently doing a R course and I struggle with knitting an HTML file.
All the code works fine within RStudio. The file also knits properly, however it wont plot an output for the last command, when I run the inference. I added the code.
Any input is much appreciated.
Thanks
Markus
Firstly, we filter for the religions and the year of interest:
```{r filter}
gss2012 = gss %>%
filter(year =="2012")
gssCatPro2012 = gss2012 %>%
filter(relig=="Catholic" | relig=="Protestant")
```
Now we create a first histogram of both religions to get a first idea of the distributions:
{r plot both rel}
ggplot(data=gssCatPro2012, aes(x=childs))+geom_histogram()
Calculate ratio and represent in pie chart:
{r ratio}
gssCatPro2012 %>%
summarise(Catholicratio = sum(relig =="Catholic")/n())
percent <- c(32.64,67.36)
lbls <- c("Catholics", "Protestants")
pct <- round(percent/sum(percent)*100)
lbls <- paste(lbls, pct)
lbls <- paste(lbls,"%", sep="")
pie(percent, labels=lbls, col=rainbow(length(lbls)), main="Pie chart Catholics/Protestants")
Split data between religions:
{r split}
gssCat2012 = gssCatPro2012 %>%
filter(relig=="Catholic")
gssPro2012 = gssCatPro2012 %>%
filter(relig=="Protestant")
Plot first distribution of Catholics, then Protestants:
{r plot per religion}
ggplot(data=gssCat2012, aes(x=childs))+geom_histogram()
ggplot(data=gssPro2012, aes(x=childs))+geom_histogram()
Check if any NAs to clean:
{r NA}
anyNA(gssCatPro2012$childs)
completeFun <- function(data, desiredCols) {
completeVec <- complete.cases(data[, desiredCols])
return(data[completeVec, ])
}
gssCatPro2012=completeFun(gssCatPro2012,"childs")
anyNA(gssCatPro2012$childs)
Calculate means for both religions:
{r metrics}
gssCatPro2012 %>%
group_by(relig) %>%
summarise(mean_kids=mean(childs), med_kids=median(childs), sd_kids=sd(childs),n=n())
Inference
We are going to create a new variable in order to overwrite the content of the old variable relig:
{create new variable}
gssCatPro2012new <- gssCatPro2012 %>%
mutate(relignew = ifelse(relig == "Catholic", "Catholic", "Protestant"))
Now, we can run the inference function and see whether we can reject the 0 Hypothesis or not:
{hypothesis test}
inference(y = childs, x = relignew, data = gssCatPro2012new, statistic = "mean", type = "ht", null = 0, alternative = "twosided", method = "theoretical")
Modify the chunk names to use underscores instead of spaces and make sure each chunk begins with a leading "r".
For example:
{r create_new_variable}
instead of:
{create new variable}