将变量和名称传递给data.table函数

4
我有一个报告需要应用于不同的data.tables名称[j和by]。我能做到的唯一方法是在eval(substitute(value))函数中包装参数。这使得代码难以阅读。我已将j参数命名为“variable”,但我想将函数的j参数传递给setnames函数。
所以问题是:
是否有避免eval(substitute(value))结构的方法?
我能否将j参数传递给setnames函数?
library(data.table)
library(ggplot2)
data(diamonds, package = "ggplot2")
dt = as.data.table(diamonds)

var.report = function(df, value, by.value) {
  var.report = df[, list( .N,
                    sum(is.finite(eval(substitute(value)))), # count values
                    sum(is.na(eval(substitute(value)))) # count NA
  ), by = eval(substitute(by.value))]

  setnames(var.report, c("variable", "N","n.val","n.NA"))

  return(var.report)
}


var.report(dt, depth, clarity)
1个回答

3

你可以考虑使用eval(substitute,将整个函数体(或只是单独的data.table计算)进行替换:

var.report = function(df, value, by.value) {
  eval(substitute({
    var.report = df[, list( .N,
                      sum(is.finite(value)), # count values
                      sum(is.na(value)) # count NA
    ), by = by.value]

    setnames(var.report, c("variable", "N","n.val","n.NA"))

    return(var.report)
  }))
}

var.report(dt, depth, clarity)
#   variable     N n.val n.NA
#1:      SI2  9194  9194    0
#2:      SI1 13065 13065    0
#3:      VS1  8171  8171    0
#4:      VS2 12258 12258    0
#5:     VVS2  5066  5066    0
#6:     VVS1  3655  3655    0
#7:       I1   741   741    0
#8:       IF  1790  1790    0

我并不完全理解第二个问题,通常我会在原始表达式中指定名称,这有助于更好地跟踪事物,如下所示:

var.report = df[, list(N     = .N,
                       n.val = sum(is.finite(value)), # count values
                       n.NA  = sum(is.na(value)) # count NA
                      )
                , by = list(variable = by.value)]

谢谢!这个可行。关于第二个问题:在最终结果中,“by.value”被称为“变量”。我希望已经给它命名了,因为我在函数调用中明确指定了该变量的名称。现在我必须添加一个手动设置名称的代码:“setnames(df,“variable”,“by.value”)”。 - Henk

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