RでACFinderのデータベースを使って農薬検索

以前([Rで農薬検索をする[準備編]](http://qiita.com/nozma/items/c36acae01a6d343d683d), [Rで農薬検索をする[実践編]](http://qiita.com/nozma/items/56cfcadbb0a5782176aa#_reference-7f2b0697b1be00e5f54f))FAMICからデータを落としてきてアレしたんですが、既にあるものをアレしたほうがやっぱり楽でしたというお話です。

# ACFinder

ACFinder([農薬登録情報検索クライアント ACFinder - TOP](http://acfinder.kabe.info/))は農薬登録情報の検索に特化したソフトで、簡単に操作ができるだけでなくSQLによる操作もできる。FAMICの登録情報に変更があると半自動的にデータベースを更新してくれるので有り難い。農薬を扱う仕事をするならば必須のソフト。

WindowsソフトだがEasyWine([🍎 EasyWine.app 🍷 - 😃 mattintosh note 📝](http://mattintosh.hatenablog.com/entry/20140706/1404653173))を使えばMacでも特に問題なく動作する。

# RからACFinderのデータベースにアクセス

[農薬登録情報検索クライアント ACFinder - データベース定義](http://acfinder.kabe.info/?%A5%C7%A1%BC%A5%BF%A5%D9%A1%BC%A5%B9%C4%EA%B5%C1)に説明がある通り、SQLite3形式のデータベースを扱えるソフトならデータファイルを直接扱える。

従って、`dplyr`を使えば次のようにアクセスできる。

```r 
library(dplyr)

acis <- src_sqlite("/Applications/acfinder160823test/DB/acis.db")
spec <- src_sqlite("/Applications/acfinder160823test/DB/spec.db")
```

# テーブルを一括で読み込む

acis.dbとspec.dbには沢山のテーブルが含まれているのでまとめて読み込んでしまいたいところだが、例えば次のようにやると途中でエラーが出る。

```r 
# get table list ----
acis_tbl_list <- src_tbls(acis) # テーブル名一覧取得
spec_tbl_list <- src_tbls(spec) 

# create tbl ----
# purrr::walkはpurrr::mapの返り値なしバージョン。副作用だけ欲しいときにどうぞ。
purrr::walk(acis_tbl_list, function(x) assign(x, tbl(acis, x), envir=.GlobalEnv))
```

```r 
> purrr::walk(acis_tbl_list, function(x) assign(x, tbl(acis, x), envir=.GlobalEnv))
 Show Traceback
 
 Rerun with Debug
 rsqlite_send_query(conn@ptr, statement) でエラー: 
  no such function: strconv 
```

ACFinderはSQLite3のSQLを拡張している([農薬登録情報検索クライアント ACFinder - 拡張SQL](http://acfinder.kabe.info/?%B3%C8%C4%A5SQL))のでこのようなことになる。従って適当にエラーを無視してやる必要がある。

```r 
try_read <- function(t, con){
  e <- try(assign(t, tbl(con, t), envir=.GlobalEnv), 
           silent = TRUE)
  if(class(e)[1] == "try-error"){
    cat(paste("テーブル", t, "を読み込めませんでした\n"))
    cat(e)
  }
}

purrr::walk(acis_tbl_list, function(x) try_read(x, acis))
purrr::walk(spec_tbl_list, function(x) try_read(x, spec))
```

```r 
> purrr::walk(acis_tbl_list, function(x) try_read(x, acis))
テーブル vs_sakumotsu を読み込めませんでした
Error in rsqlite_send_query(conn@ptr, statement) : 
  no such function: strconv
> purrr::walk(spec_tbl_list, function(x) try_read(x, spec))
テーブル rac を読み込めませんでした
Error in rsqlite_send_query(conn@ptr, statement) : 
  no such function: concat2
```

# 使用例

ACFinderはメーカー名を除外した農薬の通称(農薬は同じ成分・登録のものが複数メーカーから販売されている例が多い)やRACコード(農薬の作用機作によるグループに付けられたコード)など、独自定義のテーブルが多く含まれているので、うまく使えば検索結果をコンパクトにできる。

```r 
# なすでアブラムシ登録のある農薬を出力
vTsushoTekiyo %>%
  filter(sakumotsu %like% "%なす%" |
         sakumotsu %like% "%野菜類%", 
         sakumotsu %not like% "%なす%を除く)",
         byochu %like% "%アブラムシ%") %>%
  select(sakumotsu, byochu, tsusho) %>% distinct %>%
  collect %>% head %>% knitr::kable()

```

|sakumotsu      |byochu       |tsusho               |
|:--------------|:------------|:--------------------|
|なす           |アブラムシ類 |除虫菊乳剤3          |
|なす           |アブラムシ類 |マラソン乳剤         |
|なす(露地栽培) |アブラムシ類 |ダイアジノン水和剤34 |
|なす           |アブラムシ類 |スミチオン乳剤       |
|なす(露地栽培) |アブラムシ類 |ダイアジノン乳剤40   |
|なす           |アブラムシ類 |マラソン粉剤1.5      |


```r 
# なすに使えそうな農薬を対象病害虫のリスト付きで出力
vTsushoTekiyo %>%
  filter(sakumotsu %like% "%なす%" |
           sakumotsu %like% "%野菜類%",
         sakumotsu %not like% "%なす%を除く)") %>%
  group_by(sakumotsu, tsusho) %>%
  summarize(tekiyo = group_concat(byochu)) %>%
  collect %>% head %>% knitr::kable()
```

|sakumotsu                                                                                                            |tsusho               |tekiyo                                               |
|:--------------------------------------------------------------------------------------------------------------------|:--------------------|:----------------------------------------------------|
|うり科野菜類                                                                                                         |ゼンターリ顆粒水和剤 |ウリノメイガ,ウリノメイガ                            |
|きゅうり、すいか、メロン、トマト、なす、ピーマン、いちご、かんきつ、ぶどう、ばら、きく、カーネーション、シクラメン等 |タマジェット         |NA                                                   |
|なす                                                                                                                 |D-D                  |ネコブセンチュウ,ネグサレセンチュウ,コガネムシ類幼虫 |
|なす                                                                                                                 |DC油剤               |ネコブセンチュウ,ネグサレセンチュウ,コガネムシ類幼虫 |
|なす                                                                                                                 |Zボルドー            |すすかび病                                           |
|なす                                                                                                                 |アクタラAL           |コナジラミ類,マメハモグリバエ                        |

いきなり「うり科野菜類」が入ってしまっているが、検索を適当にやるとこういうこともあるので注意したほうが良い。また、2行目のタマジェットというのはプルスフォグ機という特殊な噴霧器専用の展着剤らしく、適用病害虫は存在しない。

ちなみにACFinderから検索すると1行目のような例外は大抵回避できるので、本当に農薬を検索したいだけならACFinderを使ったほうが良い。