Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安装期间从internet下载数据的包_R_Packaging - Fatal编程技术网

安装期间从internet下载数据的包

安装期间从internet下载数据的包,r,packaging,R,Packaging,是否有人知道有一个软件包在安装过程中从internet下载数据集,然后进行准备和保存,以便在使用库(packageName)加载软件包时可用?这种方法是否有缺点(除了明显的缺点,即如果数据源不可用或数据格式已更改,包安装将失败) 编辑:一些背景。数据是ZIP存档中三个选项卡分隔的文件,由联邦统计局所有,通常可自由访问。我有R代码,可以下载、提取和准备数据,最后创建了三个数据帧,可以以.RData格式保存 我正在考虑创建两个包:一个是提供数据的“数据”包,另一个是对其进行操作的“代码”包。这种方法

是否有人知道有一个软件包在安装过程中从internet下载数据集,然后进行准备和保存,以便在使用
库(packageName)
加载软件包时可用?这种方法是否有缺点(除了明显的缺点,即如果数据源不可用或数据格式已更改,包安装将失败)

编辑:一些背景。数据是ZIP存档中三个选项卡分隔的文件,由联邦统计局所有,通常可自由访问。我有R代码,可以下载、提取和准备数据,最后创建了三个数据帧,可以以
.RData
格式保存


我正在考虑创建两个包:一个是提供数据的“数据”包,另一个是对其进行操作的“代码”包。

这种方法可能效率不高,但却是一种很好的解决方法。如果您正在制作一个需要定期更新数据的包,请首先制作一个包含该数据的包。它不需要任何函数,但我喜欢setter(在本例中可能不需要)的概念&getter

然后,在制作包时,将“数据”包作为依赖项。这样,每当有人安装您的软件包时,他/她将始终拥有最新的数据

就你而言,你只需交换“数据”包中的数据,并将其上传到你想要的回购协议


如果您不知道如何构建一个包,请检查
?packages.skeleton
R CMD check
R CMD build
,我以前在发布编辑时做过这个模型。我认为它会起作用,但没有经过测试。我对它进行了评论,以便您可以看到需要更改的内容。这里的想法是检查在当前工作环境中是否存在预期的对象。如果不是,请检查可在其中找到数据的文件是否在当前工作目录中。如果未找到该文件,则提示用户下载该文件,然后继续

myFunction <- function(this, that, dataset) {

  # We're giving the user a chance to specify the dataset.
  #   Maybe they have already downloaded it and saved it.
  if (is.null(dataset)) {

    # Check to see if the object is already in the workspace.
    # If it is not, check to see whether the .RData file that
    #   contains the object is in the current working directory.
    if (!exists("OBJECTNAME", where = 1)) {
      if (isTRUE(list.files(
        pattern = "^DATAFILE.RData$") == "DATAFILE.RData")) {
        load("DATAFILE.RData")

        # If neither of those are successful, prompt the user
        #   to download the dataset.
      } else {
        ans = readline(
          "DATAFILE.RData dataset not found in working directory.
          OBJECTNAME object not found in workspace. \n
          Download and load the dataset now? (y/n) ")
        if (ans != "y")
          return(invisible())

        # I usually use RCurl in case the URL is https
        require(RCurl)
        baseURL = c("http://some/base/url/")

        # Here, we actually download the data
        temp = getBinaryURL(paste0(baseURL, "DATAFILE.RData"))

        # Here we load the data
        load(rawConnection(temp), envir=.GlobalEnv)
        message("OBJECTNAME data downloaded from \n",
                paste0(baseURL, "DATAFILE.RData \n"), 
                "and added to your workspace\n\n")
        rm(temp, baseURL)
      }
    }
    dataset <- OBJECTNAME
  }
  TEMP <- dataset
  ## Other fun stuff with TEMP, this, and that.
}

myFunction为什么不想将数据包含在软件包中?@AnandaMahto:数据会定期更改,我不想每次都提交新版本的软件包。我认为从互联网下载数据而不询问用户被认为是粗鲁的。我宁愿包含一个函数
updateData()
installData()
,这样用户就可以自己决定是否或何时这样做。然后包含数据集的一些版本号。当前数据的格式是什么?一个.RData文件?CSV?HTML?此外,我同意@DanielFischer的观点,在这个过程中最好留下一些用户决策。包中的函数是否依赖于数据?@juba。。。在这一点上,我们回到重新加载。在决定是否下载之前,可能有一种聪明的方法来确定安装的版本,并将其与在线版本进行比较。也许解析包描述文件就足够了。你说的setter和getter是什么意思?这是一个来自面向对象编程的概念,其中任何外部函数都不能访问属于类的数据/变量(在我们的例子中是我们的数据包)。相反,我们编写函数来返回变量/数据的值。这样可以保护数据不受外部影响。我知道这个概念。是否可以更改已安装软件包的数据(使用您提到的setter)?可以。但只在本地进行,因此不适用于多人分发。但如果你要用它,它可能会!我明白了——我提出了一个单独的问题:我喜欢这种方法,这类似于
tikzDevice
如何缓存字体度量。是否有用户始终可写的“默认”存储?谢谢您的输入。在我看来,使用
data()
加载数据集的标准方法允许执行自定义R脚本。正是我需要的。现在唯一悬而未决的问题是为缓存找到合适的位置。我为此提出了一个新问题:@krlmlr,我补充了一点澄清。但是,也许我不太明白你要解决的问题。谢谢。您的方法在许多情况下都是有效的,但我不想将数据推送到Github,因为我不是数据的所有者——即使数据是公开的。另外,我不想在数据更新时更新包。我相信,如果软件包从数据所有者那里下载数据,我在法律上是安全的,并且它大大减少了维护负担。我想我已经找到了我问题的答案,我接受你的回答,因为你的宝贵意见。
CheckVersionFirst <- function() {
  # Check to see if installed
  if (!"StataDCTutils" %in% installed.packages()[, 1]) {
    Checks <- "Failed"
  } else {
    # Compare version numbers
    require(RCurl)
    temp <- getURL("https://raw.github.com/mrdwab/StataDCTutils/master/DESCRIPTION")
    CurrentVersion <- gsub("^\\s|\\s$", "", 
                           gsub(".*Version:(.*)\\nDate.*", "\\1", temp))
    if (packageVersion("StataDCTutils") == CurrentVersion) {
      Checks <- "Passed"
    }
    if (packageVersion("StataDCTutils") < CurrentVersion) {
      Checks <- "Failed"
    }
  }

  switch(
    Checks,
    Passed = { message("Everything looks OK! Proceeding!") },
    Failed = {
      ans = readline(
        "'StataDCTutils is either outdated or not installed. Update now? (y/n) ")
      if (ans != "y")
        return(invisible())
      require(devtools)
      install_github("StataDCTutils", "mrdwab")
    })
# Some cool things you want to do after you are sure the data is there
}