2014-09-30 46 views
5

我想分享一些软件作为一个软件包,但是我的一些脚本似乎并不像函数那样很自然。例如,考虑下面的代码块,其中'raw.df'是包含离散和连续类型的变量的数据帧。函数'count.unique'和'squash'将在包中定义。该脚本将数据框分成两个框架,'cat.df'被视为分类数据,'cts.df'被视为连续数据。在R软件包中包含R脚本

我的想法是,用户可以读取数据框'raw.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等的列表;然而这对我来说似乎相当难看。然而,将脚本包含在软件包中的唯一条件似乎是'demo'文件夹,这似乎不是正确的方法。对于如何进行的建议将非常感激。

(但感激之情不会因为它似乎是用注释表示感谢已弃用正式表达。)

+2

我使用'研究所/脚本/'还能使文件真正的(可执行文件)脚本利特勒。 – 2014-09-30 03:51:09

+2

为什么函数返回这些数量看起来很丑陋?是否因为它不会像脚本中那样打印出来?你可以使你自己的自定义打印功能做到这一点...... – Dason 2014-09-30 04:27:32

+0

德克 - 你知道使用这种方法的包吗? – 2014-09-30 20:59:21

回答

4

这是更好地封装代码的功能。返回列表并不难看,例如,S3对象只是列表属性类别

object <- list(attribute.name = something, ..) 
class(object) <- "cname" 
return (object) 

您还可以使用inst文件夹,因为inst子目录的内容将被递归地复制到安装目录(如德克评论中提及)。

  1. 您创建一个文件夹研究所:

    inst 
    ----scripts 
        some_scripts.R 
    
  2. 你可以在你的包从一个函数调用它,并且使用system.file机制加载它。

    load_myscript <- function(){ 
        source(system.file(package='your_pkg_name','scripts/some_scripts.R')) 
    } 
    
  3. 你把它作为你的包中的任何其他功能:通过RSCRIPT或

    load_myscript() 
    
+0

我会检查一下。 – 2014-09-30 21:03:48