Извлечение аргументов функции R для использования в Knitr

Аргументы функции lm можно получить, используя:

args(lm)

Вывод

function (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 
NULL

Вопросы

Как получить:

lm (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 

с описанием (неполная справка) каждого аргумента, который будет использоваться в Sweave или knitr. Спасибо

Отредактировано

Используя функцию funExtract, предоставленную @Ananda, я очень близок к желаемому результату. Вот код моего файла Rnw с выводом.

\documentclass{article}
\usepackage[T1]{fontenc}

\begin{document}

Arguments for lm

<< label = funExtract, echo = TRUE, results = "hide", tidy = FALSE >>=
funExtract <- function(Function, section = "Usage") {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(help(A))))
  B <- grep("^_", x)                    ## section start lines
  x <- gsub("_\b", "", x, fixed = TRUE) ## remove "_\b"
  X <- rep(FALSE, length(x))
  X[B] <- 1
  out <- split(x, cumsum(X))
  out <- out[[which(sapply(out, function(x) 
    grepl(section, x[1], fixed = TRUE)))]]
  cat(out, sep = "\n")
  invisible(out)
}
@

\vspace{0.5cm}\\
funExtract function output
\vspace{0.25cm}\\
<< label = lm-usage, echo = FALSE, results = "asis" >>=
funExtract(lm, section="Usage:")
@

\vspace{0.5cm}\\
args function output
\vspace{0.25cm}\\
<< label = lm-args, echo = FALSE, results = "asis" >>=
args(lm)
@


\end{document}

Вывод

введите здесь описание изображения

Проблемы с выводом функции funExtract

  1. Как получить выделенный вывод из функции funExtract в виде другого кода?
  2. Как удалить заголовок раздела из вывода функции funExtract?

person MYaseen208    schedule 21.11.2013    source источник
comment
args(lm) должен по-прежнему работать в Sweave или Knitr. Что вы не можете сделать?   -  person Richie Cotton    schedule 21.11.2013
comment
Возможно, вы захотите взглянуть на formalArgs(lm), formals(lm) и sig(lm), последний из которых находится в пакете sig.   -  person Richie Cotton    schedule 21.11.2013
comment
Спасибо @AnandaMahto за проявленную готовность уделить время решению первой проблемы. Боюсь, out <- out[-1] тоже не дает желаемых результатов.   -  person MYaseen208    schedule 22.11.2013
comment
См. это. Есть пример файла Rnw и Rmd, который должен работать напрямую, если у вас установлена ​​самая последняя версия devtools. Если нет, замените первые несколько строк функцией helpExtract также на этой странице. Удачи.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 23.11.2013
comment
Фантастика: спасибо @AnandaMahto за то, что сэкономили ваше время и написали такую ​​замечательную функцию. Хотел бы изменить ваш комментарий как ответ, чтобы я мог пометить его как правильный ответ для будущих пользователей. А еще щедрость!!   -  person MYaseen208    schedule 23.11.2013
comment
У меня есть однострочное решение, которое я опубликую позже, чтобы решить все проблемы, которые вы упомянули.   -  person Yihui Xie    schedule 24.11.2013


Ответы (3)


Я написал функцию и опубликовал ее в качестве ответа ранее (как указано в самом вопросе), но не был полностью доволен несоответствиями или требованием, чтобы она использовалась с «уценкой» для успешного использования. После небольшой дополнительной работы я придумал эту функцию:

helpExtract <- function(Function, section = "Usage", type = "m_code", ...) {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(help(A, ...)),
                                     options = list(sectionIndent = 0)))
  B <- grep("^_", x)                    ## section start lines
  x <- gsub("_\b", "", x, fixed = TRUE) ## remove "_\b"
  X <- rep(FALSE, length(x))
  X[B] <- 1
  out <- split(x, cumsum(X))
  out <- out[[which(sapply(out, function(x) 
    grepl(section, x[1], fixed = TRUE)))]][-c(1, 2)]
  while(TRUE) {
    out <- out[-length(out)]
    if (out[length(out)] != "") { break }
  } 

  switch(
    type,
    m_code = c("```r", out, "```"),
    s_code = c("<<>>=", out, "@"),
    m_text = paste("    ", out, collapse = "\n"),
    s_text = c("\\begin{verbatim}", out, "\\end{verbatim}"),
    stop("`type` must be either `m_code`, `s_code`, `m_text`, or `s_text`")
  )
}

Довольно много, и это не совсем СУХОЙ ... но я хотел запечатлеть четыре сценария, и это была самая быстрая идея, которая пришла мне в голову. Я предполагаю четыре сценария:

  1. Тип документа — уценка, и пользователь извлекает блок кода (type = "m_code")
  2. Тип документа — уценка, и пользователь извлекает раздел без кода (type = "m_text")
  3. Тип документа — Sweave, и пользователь извлекает блок кода (type = "s_code")
  4. Тип документа — Sweave, и пользователь извлекает раздел, не относящийся к коду (type = "s_text").

Функция извлекает вывод Rd2txt. Я предпочел его другим форматам (HTML, LaTeX), чтобы позволить мне использовать одну функцию для получения того, что мне нужно, и не создавать несколько функций.


Применение

Использование отличается в зависимости от того, создаете ли вы документ «Sweave» (.Rnw) или «уценку» (.Rmd).

  1. Уценка

    Вставьте свой код в кусок кода, который выглядит примерно так (возможно, однажды я добавлю другие методы, но не сейчас):

    ```{r, echo=FALSE, results='asis'}
    cat(helpExtract(cor), sep = "\n")
    ```
    
  2. Сплести

    Представьте, что вы вставляете «дочерний» документ, который должен быть включен в основной документ, используя Sexpr{knit_child(.)}

    \Sexpr{knit_child(textConnection(helpExtract(cor, type = "s_code")), 
    options = list(tidy = FALSE, eval = FALSE))}
    

Я создал Gist, который включает функцию, пример Rmd файл и образец файла Rnw. Не стесняйтесь оставлять комментарии и предложения здесь, в Stack Overflow (поскольку комментарии Gist в значительной степени бессмысленны, поскольку они не уведомляют пользователя о публикации комментария).


Если вы пытаетесь сослаться на функцию из пакета, который в данный момент не загружен, использование helpExtract должно выглядеть примерно так:

helpExtract(gls, package = "nlme")
person A5C1D2H2I1M1N2O1R2T1    schedule 23.11.2013
comment
Я протестировал эту новую функцию. Это отлично работает со статьей documentclass, но не работает с beamer на моей машине. Не почему? - person MYaseen208; 23.11.2013
comment
@MYaseen208, на самом деле я не работаю со Sweave или Beamer. Пожалуйста, не стесняйтесь разобрать мою функцию и посмотреть, сможете ли вы понять, что работает для вас. - person A5C1D2H2I1M1N2O1R2T1; 23.11.2013
comment
@MYaseen208, у меня работает. Используйте шаблон здесь в качестве отправной точки. Вам, вероятно, все равно придется настроить функцию, если вы используете что-то кроме type = "s_code", поскольку ширина линии других разделов может не соответствовать слайду Beamer. - person A5C1D2H2I1M1N2O1R2T1; 23.11.2013
comment
Требуются модификации для таких функций, как stats::lm, nlme::gls. - person MYaseen208; 24.11.2013
comment
Здравствуйте, @AnandaMahto: у меня есть вопрос здесь, касающийся функции helpExtract. - person MYaseen208; 05.10.2014

У меня есть функция usage() в пакете formatR, которая фиксирует аргументы функции. На данный момент вы должны использовать версию для разработки (>= 0.10.3).

Для knitr у меня также есть недавнее изменение (т. е. также протестируйте его версию для разработки на Github), поэтому что вы можете гораздо проще отображать использование функции: вы можете использовать новую опцию блока code для ввода кода в блок.

Соедините две части вместе, и вы сможете написать фрагмент кода следующим образом:

<<test, code=formatR::usage(lm), eval=FALSE>>=
@

Причина, по которой эти функции появились недавно, заключалась в том, что они мне тоже понадобились. Я хотел показать использование функций с подсветкой синтаксиса. Это решение совместимо со всеми форматами документов, которые поддерживает knitr, а не только с Rnw.

person Yihui Xie    schedule 25.11.2013
comment
Хорошая функция. Спасибо @Yihui за отличную работу. Ширина вывода этой функции может контролироваться чем-то вроде этого formatR::usage(FUN=lm, width=50). Функция helpExtract от @AnandaMahto является более общей, поскольку она может извлекать любой раздел файла справки. - person MYaseen208; 25.11.2013

Вы можете использовать Rd_db для получения данных Rd из пакета.

x <- Rd_db("stats")

Извлеките справку lm из этого:

lmhelp <- x[basename(names(x))=="lm.Rd"]

Затем используйте capture.output и Rd2latex, чтобы получить латекс страницы справки:

lmhelptex <- capture.output(Rd2latex(lmhelp[[1]]))

И вытащите сегменты, которые вы хотите включить в свой файл rnw:

lmhelptex[do.call(":",as.list(grep("Usage",lmhelptex)))]
[1] "\\begin{Usage}"                                                    
[2] "\\begin{verbatim}"                                                 
[3] "lm(formula, data, subset, weights, na.action,"                     
[4] "   method = \"qr\", model = TRUE, x = FALSE, y = FALSE, qr = TRUE,"
[5] "   singular.ok = TRUE, contrasts = NULL, offset, ...)"             
[6] "\\end{verbatim}"                                                   
[7] "\\end{Usage}"  

lmhelptex[do.call(":",as.list(grep("Arguments",lmhelptex)))]
 [1] "\\begin{Arguments}"                                                                           
 [2] "\\begin{ldescription}"                                                                        
 [3] "\\item[\\code{formula}] an object of class \\code{\"\\LinkA{formula}{formula}\"} (or one that"
 [4] "can be coerced to that class): a symbolic description of the"                                 
 [5] "model to be fitted.  The details of model specification are given"                            
 [6] "under `Details'."                                                                             
 [7] ""                                                                                             
 [8] "\\item[\\code{data}] ...snip...
person James    schedule 21.11.2013