【问题标题】:How to properly define a function that uses internal dataset如何正确定义使用内部数据集的函数
【发布时间】:2021-06-04 16:39:22
【问题描述】:

我想创建一些 R 函数并将它们组合在一个小型 R 包中,用于大学课程。这些函数将采用输入值(胸高处的树直径)并根据文章中发布的带有参数的函数估计输出参数(生物量)。这些参数取决于树种,功能是这种形式(只是一个简化的例子):

fun <- function(diameter, species){
parameter <- dataframe$parameter[which(dataframe$species == species)]
mass <- parameter*diameter
return(mass)
}

因此,函数必须在表中查找这些参数(在本例中名为 dataframe)。

现在我想知道最好的做法是什么,来实现它。我将数据作为 Excel 表格,我可以在 R 中将它们加载为data.frames。我可以使用dput() 并将输出粘贴到我的函数中,因此它们包含用于查找值的数据。但是,这种方法可能不是最有效的方法吗?它会使函数变得非常不可读。

data.frame 创建为用户环境中的全局变量可能也不是最佳做法?

所以,我想知道,数据集应该如何包含在 R 函数中。不幸的是,我太愚蠢了,无法用谷歌搜索解决方案(搜索“data.frame”或“function”等术语显然会导致很多与我的问题无关的内容;我没有有用的关键字可以开始)。我希望这个问题不是重复的(建议显示了非常不同的问题)。

【问题讨论】:

  • 感谢您的快速回答!
  • 仅供参考:在您的示例函数中,不需要which(也不需要return)。

标签: r function


【解决方案1】:

问题是数据是否作为测试数据集对用户可见。那么数据框的正确位置是包的/data 子目录中的一个文本文件。这是标准方法。但是,如果数据只是参数,可以在包中定义一个本地环境,然后将数据与包的函数/Rfolder 一起放在一个.R 脚本中。

您可以查看 ma​​relac 包的 source code,这是一个使用这两种技术的水生科学包。

终于可以将它存储在R/sysdata.R 中,如@Gabor Grothendiek 提供的链接所示。

简单介绍一下marelac中使用的方法:首先,有一个文件aaa.R定义了一个新的环境,如下:

.marelac <- new.env() 

文件名aaa.R 确保首先加载它,点表示它是一个“隐藏”变量。

然后一个函数可以使用它:

## -----------------------------------------------------------------------------
## Seawater Composition
##  function taken from package marelac, license: GPL >= 2 
## -----------------------------------------------------------------------------

.marelac$sw_comp <- c(Na = 0.3065958, Mg = 0.0365055, Ca = 0.0117186,
           K = 0.0113495, Sr = 0.0002260, Cl = 0.5503396, SO4 = 0.0771319,
           HCO3 = 0.0029805, Br = 0.0019134, CO3 = 0.0004078, BOH4 = 0.0002259,
           F = 0.0000369, OH = 0.0000038, BOH3 = 0.0005527, CO2 = 0.0000121)

sw_comp <- function(species = c("Na", "Mg", "Ca", "K", "Sr", "Cl", "SO4", "HCO3",
                    "Br", "CO3", "BOH4", "F", "OH", "BOH3", "CO2")) {

  species <- match.arg(species, several.ok = TRUE)
  .marelac$sw_comp[species]
} 

这里sw_comp是海水的标准成分。这是使用这种技术的最小(几乎是微不足道的)功能,还有其他一些功能,例如gas_solubilitydiffcoeff

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2012-09-25
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多