2017-07-12 15 views
2

私はpostgresqlデータベース接続を持っており、データベースからテーブルを取得したいと考えています。おそらく、接続情報を別のファイルに保存することをお勧めしますか? 私はちょうど今、2つのファイルを持っている:スクリプトから1つの変数のみを取得します

#getthetable.R 
library(tidyverse) 
library(dbplyr) 


## connect to db 
con <- src_postgres(dbname = "thedbname", 
        host = "blablabla.amazonaws.com", 
        port = NULL, 
        user = "myname", 
        password = "1234") 

thetable <- tbl(con, "thetable") %>% select(id, apples, carrots) %>% collect 

そして:

#main.R 
library(tidyverse) 

## get data from getthetable script with connection 
source("rscripts/getthetable.R") 

これは今main.R.の両方conthetable変数が利用できるようにします変数をthetableからgetthetable.Rに変更するだけです。それ、どうやったら出来るの?変数を出す?

また、rでdb接続を処理するときのベストプラクティスはありますか?私の考えは論理的ですか?私がやっていることに欠点があるのでしょうか、あるいはほとんどの人がメインのスクリプトと一緒に接続するだけですか?

+1

Rのオブジェクトは* environments *に属し、ファイルには属しません。同じ環境から2つのファイルをソースする場合、そこに定義されているすべてのオブジェクトが環境に属します(他の環境にオブジェクトを明示的に配置しない限り)。あなたは 'rm'(そして' con'オブジェクトも含む)を使ってオブジェクトを削除するか、関数の中で 'con'を定義することができます。 – nicola

+0

応答@ニコラありがとう。私のアプローチはあなたに合っていますか?スクリプト内のデータと接続を分離するのは論理的ですか、それとも心配していますか?また、私はあなたのフィードバックをどのように行動するかわかりません...あなたは接続の詳細スクリプト内でrm()を使うべきだと言っていますか?それは私の望むtbl 'thetable'を削除しますか?従来のアプローチは何ですか? –

答えて

1

私はまた別のファイルではなく、このような指定された環境の中で(接続のような)のようなものをキャプチャしたい:

ConnectionManager <- local({ 

    con <- src_postgres(dbname = "thedbname", 
         host = "blablabla.amazonaws.com", 
         port = NULL, 
         user = "myname", 
         password = "1234") 



    collectTable <- function() { 

    tbl(con, "thetable") %>% select(id, apples, carrots) %>% collect 

    } 

    list(collectTable = collectTable) 


}) 

ファイルや缶を調達した後、1つのオブジェクトのみConnectionManagerを持っている。この方法をConnectionManager$collectTable()で表を入手してください。さらに、簡単に拡張して他のテーブルを取得したり、いくつかの接続ユーティリティ関数を組み込んだりすることができます。

関連する問題