8

次の関数を使用して、使用可能なすべてのパッケージのリストを取得できます。

ap <- available.packages()

しかし、R内からこれらのパッケージの説明を取得するにはどうすればよいので、data.frameパッケージと説明の2つの列を持つことができますか?

4

3 に答える 3

17

ほぼ10年前の受け入れられた回答の編集。おそらく必要なのは、(スクレイピングを練習したい場合を除いて) スクレイピングではなくtools::CRAN_package_db()、既存のインターフェースを使用することです: . 例:

> db <- tools::CRAN_package_db()[, c("Package", "Description")]
> dim(db)
[1] 18978     2
> 

この関数は、(現在) 66 列を戻します。ここで関心のあるものはその一部です。


「説明」は数行に及ぶ可能性があるため、実際には「パッケージ」と「タイトル」が必要だと思います。したがって、前者は次のとおりです。「説明」が本当に必要な場合は、最後のサブセットに「説明」を入れてください。

R> ## from http://developer.r-project.org/CRAN/Scripts/depends.R and adapted
R>
R> require("tools")
R>
R> getPackagesWithTitle <- function() {
+     contrib.url(getOption("repos")["CRAN"], "source") 
+     description <- sprintf("%s/web/packages/packages.rds", 
+                            getOption("repos")["CRAN"])
+     con <- if(substring(description, 1L, 7L) == "file://") {
+         file(description, "rb")
+     } else {
+         url(description, "rb")
+     }
+     on.exit(close(con))
+     db <- readRDS(gzcon(con))
+     rownames(db) <- NULL
+
+     db[, c("Package", "Title")]
+ }
R>
R>
R> head(getPackagesWithTitle())               # I shortened one Title here...
     Package              Title
[1,] "abc"                "Tools for Approximate Bayesian Computation (ABC)"
[2,] "abcdeFBA"           "ABCDE_FBA: A-Biologist-Can-Do-Everything of Flux ..."
[3,] "abd"                "The Analysis of Biological Data"
[4,] "abind"              "Combine multi-dimensional arrays"
[5,] "abn"                "Data Modelling with Additive Bayesian Networks"
[6,] "AcceptanceSampling" "Creation and evaluation of Acceptance Sampling Plans"
R>
于 2012-07-19T13:21:26.760 に答える
7

Dirk は素晴らしい回答を提供してくれました。私のソリューションを完成させた後、彼の回答を見て、ばかげているように見えることを恐れて、私のソリューションを投稿することについてしばらく議論しました。しかし、以下の 2 つの理由から投稿することにしました。

  1. 私のような初心者のスクレーパーにとって有益です
  2. それをするのにしばらく時間がかかったので、どうしてですか:)

私はこの考えに取り組み、Web スクレイピングを行い、スクレイピング元のサイトとして crantastic を選択する必要があると考えました。最初にコードを提供し、次に学習に非常に役立つ 2 つのスクレイピング リソースを提供します。

library(RCurl)
library(XML)

URL <- "http://cran.r-project.org/web/checks/check_summary.html#summary_by_package"
packs <- na.omit(XML::readHTMLTable(doc = URL, which = 2, header = T, 
    strip.white = T, as.is = FALSE, sep = ",", na.strings = c("999", 
        "NA", " "))[, 1])
Trim <- function(x) {
    gsub("^\\s+|\\s+$", "", x)
}
packs <- unique(Trim(packs))
u1 <- "http://crantastic.org/packages/"
len.samps <- 10 #for demo purpose; use:
#len.samps <- length(packs) # for all of them
URL2 <- paste0(u1, packs[seq_len(len.samps)]) 
scraper <- function(urls){ #function to grab description
    doc   <- htmlTreeParse(urls, useInternalNodes=TRUE)
    nodes <- getNodeSet(doc, "//p")[[3]]
    return(nodes)
}
info <- sapply(seq_along(URL2), function(i) try(scraper(URL2[i]), TRUE))
info2 <- sapply(info, function(x) { #replace errors with NA
        if(class(x)[1] != "XMLInternalElementNode"){
            NA
        } else {
            Trim(gsub("\\s+", " ", xmlValue(x)))
        }
    }
)
pack_n_desc <- data.frame(package=packs[seq_len(len.samps)], 
    description=info2) #make a dataframe of it all

資力:

  1. Webスクレイピングに関するtalkstats.comスレッド(初心者向けの素晴らしい例)
  2. HTMLに関するw3schools.comサイト(非常に役立ちます)
于 2012-07-19T15:24:48.990 に答える
1

OP にはパッケージDescriptionsが含まれていないため、演習としてHTML スクレーパー ( rvest )を使用してこれを実行したかったのです。available.packages()

library('rvest')
url <- 'https://cloud.r-project.org/web/packages/available_packages_by_name.html'
webpage <- read_html(url)
data_html <- html_nodes(webpage,'tr td')
length(data_html)

P1 <- html_nodes(webpage,'td:nth-child(1)') %>% html_text(trim=TRUE)  # XML: The Package Name
P2 <- html_nodes(webpage,'td:nth-child(2)') %>% html_text(trim=TRUE)  # XML: The Description
P1 <- P1[lengths(P1) > 0 & P1 != ""]  # Remove NULL and empty ("") items
length(P1); length(P2);

mdf <- data.frame(P1, P2, row.names=NULL)
colnames(mdf) <- c("PackageName", "Description")

# This is the problem! It lists large sets column-by-column,
# instead of row-by-row. Try with the full list to see what happens.
print(mdf, right=FALSE, row.names=FALSE)

# PackageName Description                                                             
# A3          Accurate, Adaptable, and Accessible Error Metrics for Predictive\nModels
# abbyyR      Access to Abbyy Optical Character Recognition (OCR) API                 
# abc         Tools for Approximate Bayesian Computation (ABC)                        
# abc.data    Data Only: Tools for Approximate Bayesian Computation (ABC)             
# ABC.RAP     Array Based CpG Region Analysis Pipeline                                
# ABCanalysis Computed ABC Analysis

# For small sets we can use either:
# mdf[1:6,] #or# head(mdf, 6)

ただし、小さな配列/データフレーム リスト (サブセット) では非常にうまく機能しますが、完全なリストでは表示上の問題が発生し、データがごとに表示されるか、整列されていません。これをページングして、新しいウィンドウで適切にフォーマットしておけばよかったのにと思います。pageを使用してみましたが、うまく動作しませんでした。


EDIT: 推奨される方法は上記ではなく、Dirkの提案を使用することです(以下のコメントから):

db <- tools::CRAN_package_db()
colnames(db)
mdf <- data.frame(db[,1], db[,52])
colnames(mdf) <- c("Package", "Description")
print(mdf, right=FALSE, row.names=FALSE)

ただし、これにはまだ前述の表示の問題があります...

于 2018-09-07T17:42:26.950 に答える