【问题标题】:Source only a single variable from a script仅从脚本中获取单个变量
【发布时间】:2017-07-12 04:16:47
【问题描述】:

我有一个 postgresql 数据库连接并想从数据库中获取一个表。大概将连接信息保存在不同的文件中是一种好习惯? 我现在有两个文件:

#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") 

这使得 conthetable 变量在 main.R 中都可用。我只想要来自 getthetable.R 的变量thetable。我怎么做?遗漏 con 变量?

另外,在 r 中使用 db 连接时,这里有最佳实践吗?我的想法合乎逻辑吗?我正在做的事情是否有缺点,或者大多数人只是将连接与主要脚本放在一起?

【问题讨论】:

  • R 中的对象属于 environments 而不是文件。如果您从同一个环境中获取两个文件,则其中定义的每个对象都属于该环境(除非您明确地将对象放在其他环境中)。您可以使用rm 删除任何对象(以及您的con 对象)或在函数中定义con
  • 感谢@nicola 的回复。我的方法对你有意义吗?将连接与脚本中的数据分开是否合乎逻辑,还是我过度担心?另外,我不确定如何处理您的反馈...您是说我应该在连接详细信息脚本中使用 rm() 吗?这会删除我想要的 tbl thetable 吗?这里的传统方法是什么?

标签: r rpostgresql dbplyr


【解决方案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)


})

这样您在获取文件后只有一个对象ConnectionManager,并且可以使用ConnectionManager$collectTable() 获取表。此外,您可以轻松扩展它以获取其他表或包含一些连接实用程序功能。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多