我想将一些软件作为一个软件包共享,但我的一些脚本似乎并不像函数那样自然。例如,考虑下面的代码块,其中' raw.df'是一个包含离散和连续变量的数据框。功能' count.unique'和#'壁球'将在包中定义。该脚本将数据框分成两个框架,“cat.df”和“被视为分类数据和< cts.df'被视为连续数据。
我对如何使用它的想法是,用户将在数据框中读取原始文件,获取脚本,然后以交互方式编辑“cat.df'和' cts.df',或许可以组合一些类别并转换一些变量。
dcutoff <- 9
tail(raw.df)
(nvals <- apply(raw.df, 2, count.unique))
p <- dim(raw.df)[2]
(catvar <- (1:p)[nvals <= dcutoff])
p.cat <- length(catvar)
(ctsvar <- (1:p)[nvals > dcutoff])
p.cts <- length(ctsvar)
cat.df <- raw.df[ ,catvar]
for (i in 1:p.cat) cat.df[ ,i] <- squash(cat.df[ ,i])
head(cat.df)
for(i in 1:p.cat) {
cat(as.vector(table(cat.df[ ,i])), "\n")
}
cts.df <- raw.df[ ,ctsvar]
for(i in 1:p.cts) {
cat( quantile(cts.df[ ,i], probs = seq(0, 1, 0.1)), "\n")
}
现在,这可以成为一个函数,返回一个包含nvals,p,p.cat,cat.df等的列表;然而这对我来说似乎相当难看。但是,在程序包中包含脚本的唯一规定似乎是&#39; demo&#39;文件夹似乎不是正确的方法。将非常感激地收到关于如何进行的建议。
(但感谢不会被正式表达,因为似乎不赞成使用评论来表达感谢。)
答案 0 :(得分:4)
最好将代码封装在函数中。返回列表并不难看,例如S3对象只是列表,带有属性类。
object <- list(attribute.name = something, ..)
class(object) <- "cname"
return (object)
您还可以使用inst
文件夹(如Dirk评论中所述),因为inst
子目录的内容将以递归方式复制到安装目录中。
您创建了一个inst文件夹:
inst
----scripts
some_scripts.R
您可以从包中的函数调用它,并使用system.file
机制加载它。
load_myscript <- function(){
source(system.file(package='your_pkg_name','scripts/some_scripts.R'))
}
您将其称为包中的任何其他功能:
load_myscript()