2013-07-28 4 views
3

Я хочу пройти через пакет и узнать, кто является упомянутым автором для файла справки каждой функции.Доступ к элементам из R-файла R?

Я искал функцию для извлечения элементов из файла справки R и нашел его. Самый близкий, который я мог найти, - this post, от Ноама Росса.

Существует ли такая функция? (если нет, я предполагаю, что я взломаю код Ноама, чтобы разобрать Rd-файл и найти интересующий меня элемент).

Спасибо, Tal.

Потенциальный пример кода:

get_field_from_r_help(topic="lm", field = "Description") # 
# output: 

«ого» используется, чтобы соответствовать линейным моделям. Его можно использовать для проведения регрессии , анализа дисперсии одиночного страта и анализа ковариации (хотя «aov» может обеспечить более удобный интерфейс для них).

+0

Возможный дубликат [Как написать содержимое справки по файлу из R?] (Http://stackoverflow.com/questions/7493843/how-to-write-contents-of-help-to-a- file-from-in-r) –

+0

Пример ввода и вывода? – Spacedman

+1

Joshua - это не дубликат, так как это касается только процесса извлечения всего текста, а не того, как его анализировать. Spacedman - через минуту. –

ответ

5

This document Дункан Мердока на разборе Rd файлы будут полезны, как будет this SO post.

Из них, вероятно, можно попробовать что-то вроде следующего:

getauthors <- function(package){ 
    db <- tools::Rd_db(package) 
    authors <- lapply(db,function(x) { 
     tags <- tools:::RdTags(x) 
     if("\\author" %in% tags){ 
      # return a crazy list of results 
      #out <- x[which(tmp=="\\author")] 
      # return something a little cleaner 
      out <- paste(unlist(x[which(tags=="\\author")]),collapse="") 
     } 
     else 
      out <- NULL 
     invisible(out) 
     }) 
    gsub("\n","",unlist(authors)) # further cleanup 
} 

Затем мы можем запустить это на упаковке или два:

> getauthors("knitr") 
                        d:/RCompile/CRANpkg/local/3.0/knitr/man/eclipse_theme.Rd 
                                " Ramnath Vaidyanathan" 
                         d:/RCompile/CRANpkg/local/3.0/knitr/man/image_uri.Rd 
                                " Wush Wu and Yihui Xie" 
                         d:/RCompile/CRANpkg/local/3.0/knitr/man/imgur_upload.Rd 
                       " Yihui Xie, adapted from the imguR package by Aaron Statham" 
                          d:/RCompile/CRANpkg/local/3.0/knitr/man/knit2pdf.Rd 
                         " Ramnath Vaidyanathan, Alex Zvoleff and Yihui Xie" 
                          d:/RCompile/CRANpkg/local/3.0/knitr/man/knit2wp.Rd 
                              " William K. Morris and Yihui Xie" 
                         d:/RCompile/CRANpkg/local/3.0/knitr/man/knit_theme.Rd 
                             " Ramnath Vaidyanathan and Yihui Xie" 
                        d:/RCompile/CRANpkg/local/3.0/knitr/man/knitr-package.Rd 
                              " Yihui Xie <http://yihui.name>" 
                         d:/RCompile/CRANpkg/local/3.0/knitr/man/read_chunk.Rd 
         " Yihui Xie; the idea of the second approach came from Peter Ruckdeschel (author of the SweaveListingUtils package)" 
                         d:/RCompile/CRANpkg/local/3.0/knitr/man/read_rforge.Rd 
                              " Yihui Xie and Peter Ruckdeschel" 
                          d:/RCompile/CRANpkg/local/3.0/knitr/man/rst2pdf.Rd 
                               " Alex Zvoleff and Yihui Xie" 
                           d:/RCompile/CRANpkg/local/3.0/knitr/man/spin.Rd 
" Yihui Xie, with the original idea from Richard FitzJohn (who named it as sowsear() which meant to make a silk purse out of a sow's ear)" 

А может быть инструменты:

> getauthors("tools") 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/bibstyle.Rd 
                   " Duncan Murdoch" 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/checkPoFiles.Rd 
                   " Duncan Murdoch" 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/checkRd.Rd 
                " Duncan Murdoch, Brian Ripley" 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/getDepList.Rd 
                    " Jeff Gentry " 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/HTMLlinks.Rd 
                "Duncan Murdoch, Brian Ripley" 
      D:/murdoch/recent/R64-3.0/src/library/tools/man/installFoundDepends.Rd 
                    "Jeff Gentry" 
       D:/murdoch/recent/R64-3.0/src/library/tools/man/makeLazyLoading.Rd 
                "Luke Tierney and Brian Ripley" 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/parse_Rd.Rd 
                   " Duncan Murdoch " 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/parseLatex.Rd 
                    "Duncan Murdoch" 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/Rd2HTML.Rd 
                " Duncan Murdoch, Brian Ripley" 
       D:/murdoch/recent/R64-3.0/src/library/tools/man/Rd2txt_options.Rd 
                    "Duncan Murdoch" 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/RdTextFilter.Rd 
                   " Duncan Murdoch" 
       D:/murdoch/recent/R64-3.0/src/library/tools/man/SweaveTeXFilter.Rd 
                    "Duncan Murdoch" 
         D:/murdoch/recent/R64-3.0/src/library/tools/man/texi2dvi.Rd 
        " Originally Achim Zeileis but largely rewritten by R-core." 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/tools-package.Rd 
" Kurt Hornik and Friedrich Leisch Maintainer: R Core Team [email protected]" 
       D:/murdoch/recent/R64-3.0/src/library/tools/man/vignetteDepends.Rd 
                    " Jeff Gentry " 
       D:/murdoch/recent/R64-3.0/src/library/tools/man/vignetteEngine.Rd 
              "Duncan Murdoch and Henrik Bengtsson." 
        D:/murdoch/recent/R64-3.0/src/library/tools/man/writePACKAGES.Rd 
                 " Uwe Ligges and R-core." 

Некоторые функции не имеют поля автора, поэтому это ju st падает, когда он вызывает unlist в конце getauthors, но код может быть изменен немного, чтобы вернуть NULL значения для них.

Кроме того, дальнейший синтаксический анализ станет немного сложнее, потому что авторы пакетов, похоже, используют это поле совершенно по-разному. Есть только одно поле автора в devtools. В есть куча автомобиля, каждый из которых содержит адрес электронной почты. Etc и т. Д. Но это дает вам доступную информацию, с которой вы сможете работать дальше.

Примечание. Моя предыдущая версия этого ответа предоставила решение, если у вас полный путь к файлу Rd, но не работал, если вы пытались сделать это для установленного пакета. Следуя совету Тайлера, я разработал более полное решение.

+0

Можете ли вы показать нам пример для пакета, в котором вы запускаете все файлы .Rd и захватываете автора. Я пробовал этот подход, но не смог добиться успеха и хотел бы, чтобы этот более чистый подход работал. –

+1

@TylerRinker См. Обновление. Я попробовал это на нескольких пакетах и, кажется, работает в целом. – Thomas

+0

Очень хороший подход для обмена +1 –

1

Это мой подход, используя некоторые предложения, сделанные другими:

package <- "qdap" 
funs <- unclass(lsf.str(envir = asNamespace(package))) 

out <- sapply(funs, function(x) { 
    x <- try(capture.output(tools:::Rd2txt(utils:::.getHelpFile(as.character(help(x, help_type="text")))))) 
    Auth_lines <- grep("_\bA_\bu_\bt_\bh_\bo_\br(_\bs):", x, fixed = TRUE) 
    if (identical(Auth_lines, integer(0))) { 
     return(NA) 
    } 
    gsub("^\\s+|\\s+$", "", x[Auth_lines +2]) 
}) 

## To look at just the ones with author fields: 
out[!sapply(out, is.na)] 

## > out[!sapply(out, is.na)] 
##               beg2char 
##     "Josh O'Brien, Justin Haynes and Tyler Rinker" 
##               bracketX 
##  "Martin Morgan and Tyler Rinker <[email protected]>." 
##             bracketXtract 
##  "Martin Morgan and Tyler Rinker <[email protected]>." 
##               char2end 
##     "Josh O'Brien, Justin Haynes and Tyler Rinker" 
##             cm_df.transcript 
## "DWin, Gavin Simpson and Tyler Rinker <[email protected]>." 
##               gantt 
##   "DigEmAll (<URL: stackoverflow.com>) and Tyler Rinker" 
##              gantt_wrap 
##  "Andrie de Vries and Tyler Rinker <[email protected]>." 
##                genX 
##  "Martin Morgan and Tyler Rinker <[email protected]>." 
##              genXtract 
##  "Martin Morgan and Tyler Rinker <[email protected]>." 
##                hash 
##  "Bryan Goodrich and Tyler Rinker <[email protected]>." 
##               name2sex 
## "Dason Kurkiewicz and Tyler Rinker <[email protected]>." 
##             read.transcript 
##  "Bryan Goodrich and Tyler Rinker <[email protected]>." 
##              sentCombine 
## "Dason Kurkiewicz and Tyler Rinker <[email protected]>." 
##              sentSplit 
## "Dason Kurkiewicz and Tyler Rinker <[email protected]>." 
##                TOT 
## "Dason Kurkiewicz and Tyler Rinker <[email protected]>." 
##               v.outer 
## "Vincent Zoonekynd and Tyler Rinker <[email protected]>." 
+0

Привет Тайлер, отличный ответ (вы получаете +1, так как Томас, похоже, нашел некоторые более приятные функции, на которые можно положиться). Спасибо :) –

Смежные вопросы