将R脚本包含在R软件包中

5
我想分享一些软件作为一个包,但我的一些脚本似乎不太适合作为函数。例如,考虑以下代码块,其中“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")
}

现在,这当然可以转换为一个函数,返回包含nvals、p、p.cat、cat.df等的列表;然而,这对我来说似乎相当丑陋。但是,似乎只有“演示”文件夹才提供了将脚本包含在软件包中的规定方法,这似乎不是正确的方法。关于如何继续进行的建议将不胜感激。
(但是,感激之情不会被正式地表达,因为使用评论表达感谢已经过时了。)

2
我使用 inst/scripts/,并通过 Rscript 或 littler 将文件变成真正的(可执行)脚本。 - Dirk Eddelbuettel
2
为什么返回这些数量的函数在你看来很丑?是因为它不能像脚本中的方式一样打印输出吗?你可以编写自己的自定义打印函数来实现这一点... - Dason
Dirk - 你知道有没有一个使用这种方法的软件包吗? - Murray Jorgensen
Dason - 我正在尝试为软件包用户建立一个交互式拟合环境。在这样的情况下从列表中提取项目似乎不是用户非常自然的事情。 - Murray Jorgensen
1个回答

4

封装代码在函数中更好。返回列表并不丑陋,例如S3对象只是一个带有属性类的列表

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

您也可以使用inst文件夹(如Dirk评论中所述),因为inst子目录的内容将递归地复制到安装目录中。
  1. you create an inst folder:

    inst
    ----scripts
        some_scripts.R
    
  2. You can call it from a function in your package and use system.file mechanism to load it.

    load_myscript <- function(){
      source(system.file(package='your_pkg_name','scripts/some_scripts.R'))
    }
    
  3. You call it as any other function in your package:

    load_myscript()
    

我会去查看这个。 - Murray Jorgensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接