2016-08-03 17 views
0

Gmail APIにアクセストークンを提供せずに再現可能なSNAFUを簡単に提供できないため、しかし、私の希望は、私の記述から十分に明らかな問題を乗り越えていることです。私達は見るでしょう...同じR関数がグローバルEnvの関数/オブジェクトとして動作し、Rパッケージから読み込んだときに機能しない

私はGoogle Scholar AlertのgmailメッセージIDを取得し、それを記事タイトル、著者、出版物、日付などの列を持つデータフレームに解析する関数を書いています。私の謎私はそれを対話的にロードするときに働くのと同じコードです(すなわち、セッションRAMに関数をロードします。 "my_fancy_function < - 関数(引数){blah blah})"は、関数をRの一部としてロードすると機能しませんパッケージ(la 'devtools :: load_all( "/ mypackage /")')。私のパッケージの他の主な機能はうまくいきますが、devtools :: load_all( "my_misbehaving_package /")を使ってパッケージをロードした後、パッケージのバージョンから使用しようとすると、この問題が起きます。

以下は、パッケージの一部としてロードされたときにヒールにならない関数の.Rファイルの内容です。このコードでは、あまりにも厄介なコード混乱があります。あなたの答えに指が揺れる。これは古典的な "文字列としての文字列" SNAFUのパッケージ版のように感じますが、私に教えてください。この問題は、関数評価の非常に早い段階で発生すると思われます。

UseMethod( "read_xml")のエラー: クラス "NULL"のオブジェクトに適用されるread_xmlの適用可能なメソッドがありません「

そして、ここでは、この機能のために私の全体の病気のコードです:

library(stringr) 
library(rvest) 
library(plyr) 
library(dplyr) 
library(lubridate) 
library(gmailr) 

GScholar_alert_msg_to_df <- function(message_id){ 
    one_message <- message(message_id) 
    msg_html <- body(one_message) 
    title <- read_html(msg_html) %>% html_nodes("h3") %>% html_text() 
    link <- read_html(msg_html) %>% html_nodes("h3 a") %>% html_attr("href") 
    msg_chunks <- msg_html %>% str_split("<a href") %>% unlist 
    msg_chunks <- msg_chunks[2:(length(msg_chunks)-2)] 
    excerpt <- msg_chunks %>% str_replace_all(fixed("<b>"), "") %>% 
      str_replace_all(fixed("</b>"), "") %>% 
      str_replace_all(fixed("<br>"), "") %>% 
      str_extract("<(font size=2 color=#222222|font size=\"-1\")>(.*?)</font>") %>% 
      unlist %>% str_replace_all("<(font size=2 color=#222222||font size=\"-1\")>", "") %>% 
      str_replace_all("</font>", "") 
    author_pub_field <- msg_chunks %>% str_replace_all(fixed("<b>"), "") %>% 
    str_replace_all(fixed("</b>"), "") %>% 
    str_extract("<font size=(2|\"-1\") color=#(006621|009933|008000)>(.*?)</font>") %>% 
    unlist %>% 
    str_replace_all("<font size=(2|\"-1\") color=#(006621|009933|008000)>", "") %>% 
    str_replace_all("</font>", "") 
    one_message_df <- data.frame(title, excerpt, link, author_pub_field, stringsAsFactors = FALSE) 
    one_message_df$date <- date(one_message) # needs reformatting 
    one_message_df$date %>% str_replace("[[:alpha:]]{3}, ", "") %>% 
      str_extract("^.{11}") %>% dmy -> one_message_df$date 
    one_message_df$author_only <- str_detect(one_message_df$author_pub_field, " - ") 
    one_message_df$author <- one_message_df$author_pub_field %>% 
      str_extract("^(.*?) - ") %>% str_replace(" - ", "") 
    one_message_df$author <- ifelse(one_message_df$author_only == 1, one_message_df$author, one_message_df$author_pub_field) 
    one_message_df$publication <- one_message_df$author_pub_field %>% 
      str_extract(" - (.*?)$") %>% str_replace(" - ", "") %>% 
      str_replace(", [0-9]{4}$", "") %>% str_replace("^[0-9]{4}$", NA) 
    one_message_df$publication <- str_replace(one_message_df$publication, "^[0-9]{4}$", NA) 
    one_message_df$author_MIAs <- str_detect(one_message_df$author, "&hellip;") 
    one_message_df$author %>% str_replace("&hellip;", " \\.\\.\\.") ->  one_message_df$author 
    one_message_df$pub_name_clipped <- one_message_df$publication %>% str_detect("&hellip;") 
    one_message_df$publication %>% str_replace("&hellip;", " \\.\\.\\.") -> one_message_df$publication 
    return(one_message_df) 

うん、それは醜いだが、しかし、再び、私はコードを対話的に入力された場合、それが動作を約束します。誤ったバージョンのパッケージに関しては、RStudioのトレースバックによるとエラーが上になるようですが、私はgmailrパッケージからbody()またはmessage()関数を使用していると思います。 (はい、私はターミナルを介して幸せな結論にコードを試してみました。)助けてください、ああ誰でも、あなたは私の唯一の希望です。

+0

あなたのパッケージをどのように正確に作成しましたか? NAMESPACEファイルには何が入っていますか?これらすべてのパッケージを「インポート」としてリストアップしましたか? – MrFlick

+0

@ MrFlick ドロップダウンメニューから "New Project ..."オプションを使用してRStudio内からパッケージを開始しました。私はNAMESPACEファイルを開いたことさえしていないので、その中にその正規表現の行が1つしかありません。パッケージの.Rファイルの一番上にそのパッケージのリストがあるので、パッケージをロードするとロードされます。 – Ben

+0

パッケージ内のコードに 'library()'文を入れてはいけません。あなたはNAMESPACEを別に設定するべきです。おそらくチェックアウト[Rパッケージを書く](http://r-pkgs.had.co.nz/)。また、最小限の*再現性を持たせるために、この例を減らすことはできませんか?まさにどの行がエラーを引き起こすか(エラーに直接関係しないものを削除する)? – MrFlick

答えて

0

@MrFlickさんへのありがとうございました。そのパッケージのリストをDESCRIPTIONファイルの 'Depends'フィールドに移動することで問題を解決することができました。また、 '::'演算子を使用して 'body'と 'date'関数を明示的に呼び出す必要がありましたgmailrパッケージから。これらの2つの名前は、 'base'名前空間の一部である非標準関数にも属し、パッケージ環境内でgmailrをロードすることによってマスクすることはできません。 Hadleyによると、私は自分自身を書いているときに別のパッケージの関数を使うたびに '::'を使うべきです。

関連する問題