我有这样的功能:
sub_set <- function(var) {
varname <- enquo(var)
dict <- filter(dictionary, var == !!varname)
return(dict)
}
dict <- sub_set(Age)
这不起作用,因为它返回:
〜Age中的错误:找不到对象“年龄”
如果我将函数调用为:
dict <- sub_set("Age")
它可以工作,但是我需要不带引号来调用它,因为此函数是也使用(var)的更大函数的一部分,引用它会破坏函数的其他部分。那么如何通过传递不带引号的参数来使其正常工作?
此致
答案 0 :(得分:2)
使用var
将name
转换为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中轻松完成:
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));