如何在R'中保留“backticks”;s quote()即使不需要?

如何在R'中保留“backticks”;s quote()即使不需要?,r,data.table,R,Data.table,我知道一些字符,如-(连字符)或(空格)不应该在常规的R名称中使用,因此我需要在特定场景中使用它们 下面是一个最小的可重复的例子来说明这个问题 给出下表 library(data.table) dat <- data.table(x = 1:8, y = rep(rep(c("a", "b"), each = 2), 2), `y-z` = rep(c("c", "d"), each = 4)) 现在考虑一下,

我知道一些字符,如
-
(连字符)或
(空格)不应该在常规的R名称中使用,因此我需要在特定场景中使用它们

下面是一个最小的可重复的例子来说明这个问题

给出下表

library(data.table)

dat <- data.table(x = 1:8, 
                  y = rep(rep(c("a", "b"), each = 2), 2), 
                  `y-z` = rep(c("c", "d"), each = 4))

现在考虑一下,我想在列表中或平原上指定一些查询(不要紧)。 当我检查

arg1
arg_列表[[“arg1”]]
arg_列表[[“arg4”]]
的输出时,我知道回跳已经消失。但显然,我需要它们在
data.table
by=
参数中构造适当的查询


有没有办法解决所有的问题?谢谢

最后你可以
eval
,这可能会更简单。比如说,

> ex = substitute(dat[, sum(x), by=myby], list(myby = quote(list(y, `y-z`))))
> eval(ex)
   y y-z V1
1: a   c  3
2: b   c  7
3: a   d 11
4: b   d 15
然后,您的问题是如何构建表达式
quote(list(y,`y-z`)
,这是一个基本的R问题,不需要详细了解
DT[,…,by=eval(…)]
在内部做什么

对于OP的对象,这里有一种方法,使用
调用

myby = with(arg_list, call("list", arg1, arg2))
ex = substitute(dat[, sum(x), by=myby], list(myby = myby) )
eval(ex)
从OP的注释中,您还可以在
call(…)
中命名参数:

如果有人在data.table中查找命名参数,只需使用一个不带引号的表达式
myby=with(arg_list,call(“list”,arg1,sub=arg3))
–忍者


谢谢,这个很有魅力!:)如果有人在
data.table
中查找命名参数,可以简单地使用一个不带引号的表达式
myby=with(arg_list,call(“list”,arg1,sub=arg3))
@ninjaminb Cool,很高兴它能工作:)我不知道重新命名的args——我已经将它添加到了答案中。
# simple cases
dat[, sum(x), by = eval(arg1, envir = .SD)] # works
dat[, sum(x), by = eval(arg2, envir = .SD)] # works
dat[, sum(x), by = eval(arg_list[["arg1"]], envir = .SD)] # works
dat[, sum(x), by = eval(arg_list[["arg2"]], envir = .SD)] # works

# complex cases in which "by" is constructed
dat[, sum(x), by = .(`y`, `y-z`)] # works
dat[, sum(x), by = eval("`y`, `y-z`", envir = .SD)] # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", "`y-z`"), collapse = ""), envir = .SD)] # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg2), collapse = ""), envir = .SD)]    # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", "`y`"), collapse = ""), envir = .SD)]   # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg1), collapse = ""), envir = .SD)]    # fails

dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg_list[["arg2"]]), collapse = ""), envir = .SD)] # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg_list[["arg1"]]), collapse = ""), envir = .SD)] # fails

# probably even more complex cases
dat[, sum(x), by = eval(paste(c("`y`, sub = `y-z` == 'd'"), collapse = ""), envir = .SD)] # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg_list[["arg4"]]), collapse = ""), envir = .SD)] # works
dat[, sum(x), by = eval(paste(c("`y`,", "sub =", arg_list[["arg3"]]), collapse = ""), envir = .SD)] # fails
> ex = substitute(dat[, sum(x), by=myby], list(myby = quote(list(y, `y-z`))))
> eval(ex)
   y y-z V1
1: a   c  3
2: b   c  7
3: a   d 11
4: b   d 15
myby = with(arg_list, call("list", arg1, arg2))
ex = substitute(dat[, sum(x), by=myby], list(myby = myby) )
eval(ex)