使用包函数中的动态变量名称创建 R 数据?
Create R data with a dynamic variable name from function for package?
我正在开发一个功能,它是包的一部分。
这个包包含一个新包的模板,以及一个为新包创建 R 数据的函数,这个新包必须有一个动态名称提供给这个函数。
目前我正在做以下事情:
makedata <- function(schemeName, data) {
rdsFile <- paste0(schemeName, ".rds")
varName <- paste0(schemeName)
saveRDS(
data,
file = file.path( ".", "data", rdsFile )
)
cat(
paste0(varName, " <- readRDS(\"./", rdsFile, "\")"),
file = file.path( ".", "data", paste0(varName, ".R") )
)
}
makedata(name = "test", data = letters)
这导致数据目录中有两个文件:
一个文件test.rds
包含letters
但是在加载包时它没有被R加载(不支持rds)
一个文件test.R
,其代码为test <- readRDS("./test.rds")
,当加载包时,test.rds
中的数据会加载到变量中test
其中包含 letters
.
现在CRAN不喜欢data目录下的rds文件
还有其他方法可以使用标准格式(最好是 RData
)来实现吗?
您可以尝试这样的操作:
makedata <- function(schemeName, data) {
rdataFile <- paste0(schemeName, ".rda")
## Assign data to the name saved in schemeName
assign(x = schemeName, value = data)
## Save as RData file
save(list = schemeName, file = file.path( ".", "data", rdataFile))
}
eval parse
的可能替代方案,如评论中所述。
makedata <- function(schemeName, data) {
rdaFile <- paste0(schemeName, ".rda")
fileLocation <- file.path( ".", "data", rdaFile )
varName <- paste0(schemeName)
assign(varName, data)
eval(parse(text = sprintf("save(%s, file = '%s')", varName, fileLocation)))
cat(sprintf("%s <- load(%s, file = '%s')",
varName, varName,
fileLocation
),
file = file.path( ".", "data", paste0(varName, ".R") ))
}
题外话:
此外,由于您正在开发软件包,一个方便的选项可能是使用 system.file
而不是 file.path
,因为选项 system.file('data/test.R', package = 'yourPackage')
允许在您的软件包目录中查找,无论它安装在何处。尚未测试您以前的解决方案,它可能也能正常工作。
我正在开发一个功能,它是包的一部分。 这个包包含一个新包的模板,以及一个为新包创建 R 数据的函数,这个新包必须有一个动态名称提供给这个函数。
目前我正在做以下事情:
makedata <- function(schemeName, data) {
rdsFile <- paste0(schemeName, ".rds")
varName <- paste0(schemeName)
saveRDS(
data,
file = file.path( ".", "data", rdsFile )
)
cat(
paste0(varName, " <- readRDS(\"./", rdsFile, "\")"),
file = file.path( ".", "data", paste0(varName, ".R") )
)
}
makedata(name = "test", data = letters)
这导致数据目录中有两个文件:
一个文件
test.rds
包含letters
但是在加载包时它没有被R加载(不支持rds)一个文件
test.R
,其代码为test <- readRDS("./test.rds")
,当加载包时,test.rds
中的数据会加载到变量中test
其中包含letters
.
现在CRAN不喜欢data目录下的rds文件
还有其他方法可以使用标准格式(最好是 RData
)来实现吗?
您可以尝试这样的操作:
makedata <- function(schemeName, data) {
rdataFile <- paste0(schemeName, ".rda")
## Assign data to the name saved in schemeName
assign(x = schemeName, value = data)
## Save as RData file
save(list = schemeName, file = file.path( ".", "data", rdataFile))
}
eval parse
的可能替代方案,如评论中所述。
makedata <- function(schemeName, data) {
rdaFile <- paste0(schemeName, ".rda")
fileLocation <- file.path( ".", "data", rdaFile )
varName <- paste0(schemeName)
assign(varName, data)
eval(parse(text = sprintf("save(%s, file = '%s')", varName, fileLocation)))
cat(sprintf("%s <- load(%s, file = '%s')",
varName, varName,
fileLocation
),
file = file.path( ".", "data", paste0(varName, ".R") ))
}
题外话:
此外,由于您正在开发软件包,一个方便的选项可能是使用 system.file
而不是 file.path
,因为选项 system.file('data/test.R', package = 'yourPackage')
允许在您的软件包目录中查找,无论它安装在何处。尚未测试您以前的解决方案,它可能也能正常工作。