2014-06-23 86 views
1

我有一个报告,需要应用于不同名称的data.tables [j和by]。 我通过将参数包含在eval(substitute(value))函数中来完成它的唯一方法。这使得代码不易读。 我已经命名j参数“变量”,但我想将函数的j参数传递给setnames函数。将变量和名称传递给data.table函数

所以,问题是:

有没有办法避免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) 

回答

2

如何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 

我真的不明白的第二个问题,我'd通常在原始表达式中指定名称,这有助于更好地跟踪事物,如下所示:

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)] 
+0

谢谢!这工作。关于第二个问题:在最终结果中,“by.value”被称为“变量”。我希望已经有了这个名字,因为我在函数调用中明确指出了该变量的名称。现在我必须添加手动设置名称(df,“variable”,“by.value”)。 – Henk