我正在阅读texinfo中的R FAQ source,并认为如果将其解析为R结构,将更易于管理和扩展。有几个与此相关的现有示例:

  • 财富包
  • bibtex条目
  • Rd文件

  • 每个都有一些理想的功能。

    在我看来,R社区缺少FAQ,因为它们缺乏:i)从R命令行轻松访问(即通过R包); ii)强大的搜索功能; iii)交叉引用; iv)贡献软件包的扩展。从bibtexfortunes包中汲取想法,我们可以设想一个新系统,其中:

    可以从R中搜索
  • 常见问题解答。典型的调用类似于fortune()接口(interface):faq("lattice print")faq() #surprise me!faq(51)faq(package="ggplot2")
  • 软件包可以提供自己的FAQ.rda,其格式尚不清楚(请参见下文)
  • 提供了Sweave / knitr驱动程序以输出格式正确的Markdown / LaTeX等。

  • 问题

    我不确定最好的输入格式是什么。转换现有的FAQ或添加新条目。

    在嵌套列表树中使用R语法(或临时S3 / S4 / ref classstructure
    \list(title = "Something to be \\escaped", entry = "long text with quotes, links and broken characters", category = c("windows", "mac", "test"))
    
    Rd文档虽然本身不​​是R结构(它更是LaTeX的一个子集,具有自己的解析器),但也许可以提供一个更具吸引力的输入格式示例。它在R中还具有一组tools to parse the structure。但是,其当前的目的是相当具体且有所不同的,它面向R函数的常规文档,而不是FAQ条目。它的语法也不理想,我认为更现代的标记(如markdown)将更具可读性。

    还有其他东西,也许是将markdown文件解析为R结构的示例?例如,将Rd文件偏离其预期目的吗?

    总结

    我想提出:

    1-一个很好的R结构设计(可能是类),它将fortune包扩展到更常见的条目,例如FAQ项目

    2-一种更方便的格式来输入新的常见问题解答(而不是当前的texinfo格式)

    3-以R或其他某​​种语言(野牛?)编写的解析器,用于将现有FAQ转换为新结构(1),和/或将新输入格式(2)转换为R结构。

    更新2:在悬赏期的最后两天,我得到了两个答案,虽然都很有趣,但完全不同。由于问题非常广泛(可以说是病态),所以没有一个答案可以提供完整的解决方案,因此,无论如何我现在都不会接受答案。至于赏金,我将其归因于赏金过期之前投票最多的答案,希望有办法将其平均分配。

    最佳答案

    (此地址指向第3点。)

    您可以将texinfo文件转换为XML

    wget http://cran.r-project.org/doc/FAQ/R-FAQ.texi
    makeinfo --xml R-FAQ.texi
    

    然后使用XML包读取它。
    library(XML)
    doc <- xmlParse("R-FAQ.xml")
    r <- xpathSApply( doc, "//node", function(u) {
      list(list(
        title    = xpathSApply(u, "nodename", xmlValue),
        contents = as(u, "character")
      ))
    } )
    free(doc)
    

    但是将其转换为文本要容易得多
    makeinfo --plaintext R-FAQ.texi > R-FAQ.txt
    

    并手动解析结果。
    doc <- readLines("R-FAQ.txt")
    
    # Split the document into questions
    # i.e., around lines like ****** or ======.
    i <- grep("[*=]{5}", doc) - 1
    i <- c(1,i)
    j <- rep(seq_along(i)[-length(i)], diff(i))
    stopifnot(length(j) == length(doc))
    faq <- split(doc, j)
    
    # Clean the result: since the questions
    # are in the subsections, we can discard the sections.
    faq <- faq[ sapply(faq, function(u) length(grep("[*]", u[2])) == 0) ]
    
    # Use the result
    cat(faq[[ sample(seq_along(faq),1) ]], sep="\n")
    

    关于r - R数据结构的常见问题标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10763402/

    10-12 20:12