[R] Function inside Sweave

Duncan Mackay dulcalma at bigpond.com
Sat Jan 11 04:11:37 CET 2014


Hi Silvano

To save you typing try paste0 (...) instead of paste(, sep = "")

Just checking quickly 
In 
### code chunk number 3: Serie1

for (i in 1:7){
  aux <- paste("Q", i, sep="")}

will always end up with "Q7"

Is the } to go elsewhere?
OR
Is it superfluous?

Duncan

-----Original Message-----
From: silvano at uel.br [mailto:silvano at uel.br] 
Sent: Friday, 10 January 2014 23:50
To: Duncan Mackay
Subject: Re: [R] Function inside Sweave

Dear Duncan,

I get solved the problem. This is the solution:

###################################################
### code chunk number 1: Dados
###################################################
rm(list=ls())

require(foreign)
require(xtable)
require(reshape)

setwd('C:/Colegiado de Veterinária/Dados/A2013/')

Geral = read.epiinfo('A2013.rec')
Professores = read.epiinfo('Professor.rec')

Dados = merge(Geral, Professores, by=c('ALUNO', 'DISCIPLINA'))


###################################################
### code chunk number 2: Leitura
###################################################
serie_1 = subset(Dados, SERIE=='1')
attach(serie_1)
head(serie_1)

round(100*prop.table(table(DISCIPLINA, Q1, PROFESSOR), 1), 2)

###################################################
### code chunk number 3: Serie1
###################################################
DISCIPLINA <- serie_1$DISCIPLINA
for (i in 1:7){
  aux <- paste("Q", i, sep="")}

for (i in 1:7){
  aux <- paste("nome.Questao", i, sep="")
  assign(aux, paste("Nome da Questao", i))
}

nome.Questoes = c("Apresentação da proposta de programa a ser desenvolvida 
na disciplina.",
                  "Profundidade dos temas em relação aos objetivos da 
disciplina.",
                  "Aplicabilidade dos temas abordados.",
                  "Articulação do conteúdo da disciplina com outras e com a 
profissão.",
                  "Estabelecimento de critérios de avaliação claros e 
adequados.",
                  "Os resultados das avaliações são discutidos com os 
alunos.",
                  "Atendimento da disciplina às suas expectativas.")

cria.tabela <- function(Questao, i){
  Questao1 <- get(Questao)
  tab1 <- table(DISCIPLINA, Questao1)
  tab1.prop = round(100*prop.table(tab1, 1),  2)
  capt <- nome.Questoes[i]
  tab1.txt = xtable(tab1.prop, align="l|rrrrr", label=Questao, 
caption=paste(capt))
  print(tab1.txt, format.args=list(big.mark = ".", decimal.mark = ","), 
caption.placement='top', table.placement='H')
  cat("\n\n\n")
}

Discip <- function(){
  for (i in 1:7){
    x <- paste("Q", i, sep="")
    cria.tabela(x, i)
    }
}

Discip()



Thanks a lot.

Silvano.




-----Mensagem Original----- 
From: Duncan Mackay
Sent: Friday, January 10, 2014 12:18 AM
To: silvano at uel.br
Cc: R
Subject: RE: [R] Function inside Sweave

Hi Silvano

I am not sure exactly what you want as I am not sure of the structure and
format going into xtable
but the structure after you have formed the table is apparently the same
structure.

This is what I suggested before (modified)

for(j in 1:25){
yourtable <- ...
xx <- xtable(yourtable)
caption(xx) <- paste("Table", j)
print(xx)
if(j < 25) cat("\n\n")

}

Pre xtable
If you have different colums to tabulate I suggest you use a formula or
bquote via a list to vary the columns in a loop
and these are the variables to be tabulated. You can then use this for your
column headers in xtable /latex.

durin/Post xtable

If single line header for table and formatting not needed to be changed
everything OK

otherwise inside chunk

<<head, echo=FALSE, results=tex>>=

for(j in 1:25){
  yourtable <- ...

  hdx = c("\\begin{table}[h]\n",
         "\\caption{\\prevt{} and their equivalent \\dcode{}}%\n",
         "\\label{tab:", j "}%\n",
         "\\begin{tabular}{l|rrrrr}\n")   # adjust to suit
  cat(hdx)

  # header from col names or otherwise
  out <- names(yourtable)
  out <-
  c("",
    paste("\\multicolumn{1}{c}{",
          out,
          rep(c("} & %\n", "} \\\\"), c(length(out)-1, 1)), sep = ""), "\n"
  )
  cat(out, sep = "")
  # xtable
  xx <- xtable(yourtable)

  xnd = c(\\end{tabular}\n",
          "\\end{table}\n")
  cat(xnd)

  if(j < 25) cat("\n\n")

}
@ %% end

You can add booktabs functions within tabular by cat if needed
If you have things that need to be changed they can be accessed by a
vector/list

If you have variable numbers of decimal points see an colour is black
http://tex.stackexchange.com/questions/96982/coloring-text-in-a-dcolumn-alig
ned-cell-of-a-table

Henrik Bengtsson has a package to do this sort of thing but he discontinued
it for ver 3 or 2.15 ca

Regards

Duncan

-----Original Message-----
From: silvano at uel.br [mailto:silvano at uel.br]
Sent: Friday, 10 January 2014 04:48
To: Duncan Mackay
Subject: Re: [R] Function inside Sweave

Dear Duncan,

I want relatioship two variables:  DISCIPLINA and Questions.

I have about 100 different disciplines (in same column) and 25 questions (25
differents columns).

Head is:

ALUNO DISCIPLINA FIELD1   DATA SERIE TURMA Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10
PROFESSOR Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20 Q21 Q22 Q23 Q24 Q25

Something like this:

DISCIPLINA:    "6PIV019" "6VET017" "6BIQ014" "6ZOT058" "6ZOT060"  ...
"6PIV018"

Questions: Q1, Q2, Q3,  ... Q25


I get what I want (form a one Question) with this commands:

tab1 = table(DISCIPLINA, Q1)
tab1.prop = round(100*prop.table(tab1, 1),  2) tab1.txt = xtable(tab1.prop,
align="l|rrrrr", label='Q1', caption=c("Apresentação da proposta de programa
a ser desenvolvida na disciplina", "Q1")) print(tab1.txt,
format.args=list(big.mark = ".", decimal.mark = ","),
caption.placement='top', table.placement='H')

But, I need 25 commands like this, because I have 25 questions.


I would like program a function to make this one time only. So, I try this
general function:

DISCIPLINA <- rep(c("A", "B", "C", "D", "E"), 5) for (i in 1:25){
  aux <- paste("Q", i, sep="")
  assign(aux, sample(rep(seq(1:5),5)))
}

cria.tabela <- function(Questao){
  Questao1 <- get(Questao)
  tab1 <- table(DISCIPLINA, Questao1)
  tab1.prop = round(100*prop.table(tab1, 1),  2)
  tab1.txt = xtable(tab1.prop, align="l|rrrrr", label=Questao,
  caption=paste(Questao))
  print(tab1.txt, format.args=list(big.mark = ".", decimal.mark = ","),
  caption.placement='top', table.placement='H') }

geral <- function(){
  for (i in 1:25){
    x<-paste("Q", i, sep="")
    cria.tabela(x)
    }
}

geral()



but I need change the created variable DISCIPLINA by DISCIPLINA in my
dataset and I don't get this.

If you want, I send you my dataset.


Thanks a lot.


Silvano.












-----Mensagem Original-----
From: Duncan Mackay
Sent: Thursday, January 09, 2014 1:12 AM
To: 'Silvano Cesar da Costa'
Cc: R
Subject: RE: [R] Function inside Sweave

Hi Silvano

I cannot use the data and function as the data is not available to me

for the xtable part using data from xtable try as an example to see if it
fits your needs

data(tli)
head(tli)

for(j in 1:5){ xx <- xtable(tli[1:6,]);  caption(xx) <- paste("Table", j);
print(xx); if(j < 5) cat("\n\n")}

You can amend the xtable part to suit -- the cat command gives some spacing

Regards

Duncan


Duncan Mackay
Department of Agronomy and Soil Science
University of New England
Armidale NSW 2351
Email: home: mackay at northnet.com.au


-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of Silvano Cesar da Costa
Sent: Thursday, 9 January 2014 04:24
To: r-help at r-project.org
Subject: [R] Function inside Sweave

Hi,

I have a data set involving 25 Questions (Q1, Q2, ... , Q25), 100 Disciplina
and 5 series. The variables are:

ALUNO DISCIPLINA SERIE TURMA Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 ... Q25


I want to create tables associating each of the 25 questions to the
Disciplina.
Something like:

tab1 = table(DISCIPLINA, Q1)
tab1.prop = round(100*prop.table(tab1, 1),  2) tab1.txt = xtable(tab1.prop,
align="l|rrrrr", label='Q1', caption=c("Apresentação da proposta de programa
a ser desenvolvida na disciplina", "Q1")) print(tab1.txt,
format.args=list(big.mark = ".", decimal.mark = ","),
caption.placement='top', table.placement='H')



With the help of a friend, was created the following function:

require(xtable)

DISCIPLINA <- rep(c("A", "B", "C", "D", "E"), 5) for (i in 1:25){
  aux <- paste("Q", i, sep="")
  assign(aux, sample(rep(seq(1:5),5)))
}

cria.tabela <- function(Questao){
  Questao1 <- get(Questao)
  tab1 <- table(DISCIPLINA, Questao1)
  tab1.prop = round(100*prop.table(tab1, 1),  2)
  tab1.txt = xtable(tab1.prop, align="l|rrrrr", label=Questao,
  caption=paste(Questao))
  print(tab1.txt, format.args=list(big.mark = ".", decimal.mark = ","),
  caption.placement='top', table.placement='H') }

geral <- function(){
  for (i in 1:25){
    x<-paste("Q", i, sep="")
    cria.tabela(x)
    }
}

geral()


I need to change the variable DISCIPLINA created in the function by the
variable DISCIPLINA in my dataset, but not working.


Reading data was taken with:

require(foreign)
require(xtable)
dados = read.epiinfo('C:/Colegiado de Veterinária/Dados/A2013/A2013.rec')
head(dados)
tail(dados)
str(dados)
attach(dados)

serie_1 = subset(dados, SERIE=='1')
head(serie_1)
tail(serie_1)
attach(serie_1)


How can I do this?

Thanks a lot,


---------------------------------------------
Silvano Cesar da Costa

Universidade Estadual de Londrina
Centro de Ciências Exatas
Departamento de Estatística

Fone: (43) 3371-4346

______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


---
Este email está limpo de vírus e malwares porque a proteção do avast!
Antivírus está ativa.
http://www.avast.com



---
Este email está limpo de vírus e malwares porque a proteção do avast!
Antivírus está ativa.
http://www.avast.com




More information about the R-help mailing list