【发布时间】:2020-09-07 01:24:23
【问题描述】:
我想将一个数值传递给一个函数,在该函数中我将使用它来选择数据表中的行。这是一个简单的例子,其中的数字量是一个日期:
#' Example
library(data.table)
library(ggplot2)
test <- function(date = NULL){
DT <- as.data.table(economics)
if (!is.null(date)){
date <- as.Date(date)
# See https://stackoverflow.com/questions/21658893/subsetting-data-table-using-variables-with-same-name-as-column
DT <- DT[eval(DT[,date %in% ..date])] # Pick one date
}
DT
}
请注意,它使用推荐的第二种方法here 为函数参数使用与 data.table 列相同的名称。
这适用于以下调用:
junk <- test(date = "1970-01-01")
还要注意,在现实生活中,我不会使用示例中使用的数据集。相反,我将从here 下载联合国人口数据。这是相关的,因为此数据集仅按年份对数值进行日期编码,因此无需像示例中那样使用 as.Date() 进行转换。
所以调用看起来更像:
junk <- test(date = 1970)
这就是问题所在。除了将单个值作为日期传递之外,我还想传递逻辑表达式。但是最好的方法是什么?
为方便起见,让我们将“..date”作为对日期参数的引用与“date”作为对日期列名称的引用进行区分。
在示例函数中,对DT的第二个修改当前使用:
DT <- DT[date %in% ..date],
其中 ..date 已从字符转换为日期。因为我正在使用将日期编码为数值的数据集,所以这种转换是不必要的。 (但调用代码有时可能需要将数值转换为日期。)
现在我想要类似的东西
DT <- DT [date ..date],
其中 ..date 可以是逻辑表达式的后端,例如“
因此,就数据表子集的简单选择而言,有时可以评估为:
DT <- [date == 1970],
其他时间为:
DT <- [date <= 1970]
实现这一点的最佳方法是什么?
【问题讨论】:
标签: r function date data.table arguments