R 使大型数据集在包中可用,但不作为全局变量

R 使大型数据集在包中可用,但不作为全局变量,r,R,这是我第一次尝试创建一个包,所以我猜这是一个非常基本的问题。基本上,我想从我的包中导出以下函数: load_data <- function() { requireNamespace(XML, quietly = TRUE) xmlfile <- XML::xmlParse("//server/folder/file.xml") ps <<- XML::xmlToDataFrame(xmlfile, stringsAsFactors = TRUE) } fi

这是我第一次尝试创建一个包,所以我猜这是一个非常基本的问题。基本上,我想从我的包中导出以下函数:

load_data <- function() {
  requireNamespace(XML, quietly = TRUE)
  xmlfile <- XML::xmlParse("//server/folder/file.xml")
  ps <<- XML::xmlToDataFrame(xmlfile, stringsAsFactors = TRUE)
}

find_record <- function(search_string) {
  return(ps$Var1[ps$Var2 == search_string])
}

delete_record <- function(search_string) {
  ps <<- ps[ps$Var2 != search_string, ]
  return(TRUE)
}

如果数据文件足够小,可以存储在包中,则加载数据

加载函数表明,尽管原始数据文件是XML,但可以将其转换为数据帧。因此,转换为数据帧,然后将其保存为包的数据目录中的RData文件

如果数据集太大,无法在本地存储,并且它是一个私有包

您的问题标题暗示这是一个大数据集,原始数据驻留在服务器上。在这种情况下,最好将数据存储在数据库中,并在函数中使用R的数据库访问功能

如果数据集太大,无法在本地存储,并且是公共包


我怀疑这超出了问题的范围,但是有大量的R包通过某种web API提供对在线数据库的访问。

也许内部数据部分会有所帮助…?谢谢joran,这告诉我如何在Rda文件中保存内部数据,但如何在find_record函数中访问该内部数据?我是否需要在每个函数中都使用load()命令来加载数据?老实说,我不确定,我自己从来没有这样做过。不过这并不难尝试…谢谢Richie,我想选择选项1(将RData文件存储在包中),但我希望data.frame在内存中,这样当包的用户调用find_record或delete_record函数时,他们就不必去磁盘重新加载整个数据集。基本上,我想我希望data.frame是一个全局变量,但只在包中。可以这样做吗?存储在
data
目录中的数据集对于包来说是“全局的”,但它们被设计为只读的。您可以更改它们,但您将更改副本,因此您必须决定删除记录后会发生什么。例如,如果覆盖RData文件,那么是否在用户安装的包副本中覆盖它?或者您想要一种机制来删除每个人的记录?在这种情况下,将数据存储在包中是错误的做法。