在R包中包含R脚本

Mur*_*sen 5 r function package

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

我对如何使用它的想法是,用户将在数据框中读取'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")
}
Run Code Online (Sandbox Code Playgroud)

现在,这可以成为一个函数,返回一个包含nvals,p,p.cat,cat.df等的列表; 然而这对我来说似乎相当难看.但是,在程序包中包含脚本的唯一规定似乎是"demo"文件夹,这似乎不是正确的方法.将非常感激地收到关于如何进行的建议.

(但感谢不会被正式表达,因为似乎不赞成使用评论来表达感谢.)

ags*_*udy 4

最好将代码封装在函数中。返回一个列表并不难看,例如 S3 对象只是一个带有属性 class的列表

object <- list(attribute.name = something, ..)
class(object) <- "cname"
return (object)
Run Code Online (Sandbox Code Playgroud)

您还可以使用inst文件夹(如 Dirk 评论中所述),因为子目录的内容inst将递归复制到安装目录。

  1. 您创建一个 inst 文件夹:

    inst
    ----scripts
        some_scripts.R
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以从包中的函数调用它并使用system.file机制来加载它。

    load_myscript <- function(){
      source(system.file(package='your_pkg_name','scripts/some_scripts.R'))
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以像包中的任何其他函数一样调用它:

    load_myscript()
    
    Run Code Online (Sandbox Code Playgroud)