亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用帶有knitr的循環來生成多個pdf報告…需要一點幫助,以幫助我克服麻煩

使用帶有knitr的循環來生成多個pdf報告…需要一點幫助,以幫助我克服麻煩

拉莫斯之舞 2019-12-26 10:59:06
首先,我必須承認,我很新的knitr和重現性分析的概念,但我可以看到在提高我當前的工作流程(其中包括很多的復制粘貼到Word文檔)它的潛力。我經常用組(醫院在本例中),以產生多個報告和每家醫院內,可能會有許多不同的病房說我匯報的結果。以前我使用循環跑了我所有的情節和分析在R,然后復制/粘貼工作開始; 但是,在閱讀了這篇文章(Sweave可以自動產生許多pdf嗎?)之后,它給了我希望,我實際上可以跳過很多步驟,直接從R直接通過Rnw / knitr報告。但是,嘗試一下之后,我發現有些東西還沒有完全解決(因為Rnw中的R環境似乎無法識別我要傳遞給它的循環變量?)。   ##  make my dataHospital <- c(rep("A", 20), rep("B", 20))Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)Month <- rep(seq(1:10), 4)Outcomes <- rnorm(40, 20, 5)df <- data.frame(Hospital, Ward, Month, Outcomes)##  Here is my current work flow-- produce all plots, but export as png and cut/pastefor(hosp in unique(df$Hospital)){  subgroup <- df[ df$Hospital == hosp,]  for(ward in unique(subgroup$Ward)){    subgroup2 <- subgroup[subgroup$Ward == ward,]    savename <- paste(hosp, ward)    plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))  }}# followed by much copy/pasting##  Here is what I'm trying to go for using knitr library(knitr)for (hosp in unique(df$Hospital)){  knit("C:file.path\\testing_loops.Rnw", output=paste('report_', Hospital, '.tex', sep=""))}## With the following *Rnw file## start *.Rnw Code\documentclass[10pt]{article}\usepackage[margin=1.15 in]{geometry}<<loaddata, echo=FALSE, message=FALSE>>=  Hospital <- c(rep("A", 20), rep("B", 20))Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)Month <- rep(seq(1:10), 4)Outcomes <- rnorm(40, 20, 5)df <- data.frame(Hospital, Ward, Month, Outcomes)subgroup <- df[ df$Hospital == hosp,]@\begin{document}<<setup, echo=FALSE >>=  opts_chunk$set(fig.path = paste("test", hosp , sep=""))@Some infomative text about hospital \Sexpr{hosp}想經營我的編織()的代碼塊后,我得到這個錯誤:Error in file(con, "w") : invalid 'description' argument當我看著在* .tex文件是要創建的目錄,我可以看到從醫院A中的2個PDF地塊被生產(無為B),并沒有醫院具體* .tex文件編織成PDF。預先感謝您可以提供任何幫助!
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

您不需要重新定義.Rnw文件中的數據,并且我認為警告來自于以下事實:將輸出名稱與Hospital(醫院的完整向量)而不是hosp(循環索引)放在一起。


繼你的榜樣,testingloops.Rnw是


\documentclass[10pt]{article}

\usepackage[margin=1.15 in]{geometry}

<<loaddata, echo=FALSE, message=FALSE>>=

subgroup <- df[ df$Hospital == hosp,]

@


\begin{document}

<<setup, echo=FALSE >>=

  opts_chunk$set(fig.path = paste("test", hosp , sep=""))

@


Some infomative text about hospital \Sexpr{hosp}


<<plots, echo=FALSE >>=

  for(ward in unique(subgroup$Ward)){

    subgroup2 <- subgroup[subgroup$Ward == ward,]

    #     subgroup2 <- subgroup2[ order(subgroup2$Month),]

    savename <- paste(hosp, ward)

    plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))

  }

@

\end{document}

而驅動程序R文件將僅僅是


##  make my data

Hospital <- c(rep("A", 20), rep("B", 20))

Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)

Month <- rep(seq(1:10), 4)

Outcomes <- rnorm(40, 20, 5)

df <- data.frame(Hospital, Ward, Month, Outcomes)


## knitr loop

library("knitr")

for (hosp in unique(df$Hospital)){

  knit2pdf("testingloops.Rnw", output=paste0('report_', hosp, '.tex'))

}


查看完整回答
反對 回復 2019-12-26
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

好問題!這對我來說與您在問題中提供的其他內容一起起作用。請注意,我已將您替換hosp為just x。我叫你的Rnw文件test.rnw


# input data

Hospital <- c(rep("A", 20), rep("B", 20))

Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)

Month <- rep(seq(1:10), 4)

Outcomes <- rnorm(40, 20, 5)

df <- data.frame(Hospital, Ward, Month, Outcomes)


# generate the tex files, one for each hospital in df

library(knitr)

lapply(unique(df$Hospital), function(x) 

       knit("C:\\emacs\\test.rnw", 

            output=paste('report_', x, '.tex', sep="")))


# generate PDFs from the tex files, one for each hospital in df

lapply(unique(df$Hospital), function(x)

       tools::texi2pdf(paste0("C:\\emacs\\", paste0('report_', x, '.tex')), 

                       clean = TRUE, quiet = TRUE))

我已經更換了你的循環lapply和匿名函數,這似乎往往被認為更R-ish。


在這里你能看到我更換了hosp與x中rnw文件:


\documentclass[10pt]{article}

\usepackage[margin=1.15 in]{geometry}

<<loaddata, echo=FALSE, message=FALSE>>=

  Hospital <- c(rep("A", 20), rep("B", 20))

Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)

Month <- rep(seq(1:10), 4)

Outcomes <- rnorm(40, 20, 5)

df <- data.frame(Hospital, Ward, Month, Outcomes)

subgroup <- df[ df$Hospital == x,]

@


\begin{document}

<<setup, echo=FALSE >>=

  opts_chunk$set(fig.path = paste("test", x , sep=""))

@


Some informative text about hospital \Sexpr{x}


<<plots, echo=FALSE >>=

  for(ward in unique(subgroup$Ward)){

    subgroup2 <- subgroup[subgroup$Ward == ward,]

    #     subgroup2 <- subgroup2[ order(subgroup2$Month),]

    savename <- paste(x, ward)

    plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))

  }

@

\end{document}

結果是兩個TEX文件(report_A.tex,report_B.tex),四個PDF文件的數字(A1,A2,B1,B2)和用于報告2頁的PDF(report_A.pdf,report_B.pdf),每個具有其數字在他們之中。那是你的追求嗎?


查看完整回答
反對 回復 2019-12-26
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

在這個答案中,我打算回答一個更籠統的問題:“使用循環生成多個pdf報告”,而不是您的特定示例。這是因為作為菜鳥很難遵循這種趨勢。我設法使其最終能夠工作(html版本),所以這是我的謙虛解決方案。這里可能出版了一些更好的書,我只是還不完全了解它們。


使用您的設計創建RMD文件,并將其保存在working \ input目錄中(在Rstudio中:file-> newfile-> R markdown)。該文件應包括在報告中繪制圖表所需的所有功能(只需在這些代碼塊之一中聲明它們)。認為此文件作為模板所有報告的。不必擔心在更早地將數據整理好之后將數據傳遞到環境中的問題-我將在(2)中進行介紹。要理解的關鍵問題是所有計算都在管道的更深處完成(在呈現RMD文件的那一刻)。


在不同的控制r文件中創建您需要使用的循環。在我的情況下,有一個循環遍歷目錄中的所有文件,并將它們放入數據幀。然后我想將這些數據框以及其他數據變量傳遞到RMD中,以便繪制它們。這是如何完成的:


run_on_all<-function(path_in="path:\\where\\your\\input\\and\\RMD\\is", path_out="path:\\where\\your\\output\\will\\be")

        setwd(path_in) 

        ibrary(rmarkdown)

        library(knitr)

        list_of_file_names=list.files(path = getwd, pattern = "*.csv") 

        #this gets a list of the input files names

        for (file_name in list_of_file_names) {

            data=read.csv(file_name) #read file into data frame

            report_name=paste(some_variable_name,".html",sep="") 

            render("your_template.Rmd",output_file =report_name,output_dir =path_out,list(data,all other parameters you want to input into the RMD))}

   }


最重要的命令是render函數調用。它允許您將所需的任何參數放入RMD環境。它還允許您更改報告的名稱并更改輸出位置。此外,通過調用它,您還可以生成報告,因此可以將其全部收集在一行中。(請注意,如果對RMD的調用在一個函數中,則可能會發現輸入的變量丟失了,但是報告會仍然可以正確發布)


摘要

您需要兩個文件-RMD文件,它將是所有其他報告的模板和一個控制文件??刂莆募@取數據,將其修改,然后將修改后的參數傳遞給RMD(通過render函數)。RMD獲取數據,進行一些計算,將其繪制并發布到新文件中(也通過render函數)。希望我能幫上忙。


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 855 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號