过滤功能未返回经过过滤的df

时间:2019-09-06 01:06:05

标签: r dplyr

我有这样的功能:

sub_set <- function(var) {
    varname <- enquo(var)
    dict <- filter(dictionary, var == !!varname)
    return(dict)
}
dict <- sub_set(Age)

这不起作用,因为它返回:

〜Age中的错误:找不到对象“年龄”

如果我将函数调用为:

dict <- sub_set("Age")

它可以工作,但是我需要不带引号来调用它,因为此函数是也使用(var)的更大函数的一部分,引用它会破坏函数的其他部分。那么如何通过传递不带引号的参数来使其正常工作?

此致

1 个答案:

答案 0 :(得分:2)

使用varname转换为as_string类对象,然后将library(dplyr) library(rlang) sub_set <- function(var) { varname <- as_string(enexpr(var)) dict <- filter(dictionary, var == !!varname) return(dict) } dictionary <- data.frame(var = c("Age", "x"), var2 = 1:2) # test data dict <- sub_set(Age) dict ## var var2 ## 1 Age 1 转换为字符串。

sub_set_base <- function(var) {
   varname <- deparse(substitute(var))
   subset(dictionary, var == varname)
}
sub_set_base(Age)
##   var var2
## 1 Age    1

基本R

这也可以在基数R中轻松完成:

sub_set_fo <- function(fo) {
   subset(dictionary, var == all.vars(fo))
}
sub_set_fo(~Age)
##   var var2
## 1 Age    1

公式

另一种不涉及传递字符串的基本R设计是传递公式:

function parseString(string) {
    var string = string || '',
        params, param, output, i, l, n, v, k, pk;
    params = string.split('&');
    output = [{},
        []
    ];
    for (i = 0, l = params.length; i < l; i++) {
        param = params[i].split('=');
        n = param[0].match(/^product.*?([0-9]+).*/);
        v = decodeURIComponent(param[1] || '');
        if (n && n[1]) {
            k = n[1];
            output[1][k] = output[1][k] || {};
            output[1][k]['productline'] = k;
            pk = n[0].replace(/[0-9]+/, '');
            output[1][k][pk] = v;
        } else {
            output[0][param[0]] = v;

        }
    }
    output[1] = output[1].filter(Boolean);
    return output;
}

var string = "sessionid=12345&transactionid=555555&product1=apples&productprice1=12&product1qty=1&product2=pears&productprice2=23&product2qty=3&transactionamount=58";
console.log(parseString(string));