无法从表达式中删除extraneous()

时间:2018-03-29 17:24:01

标签: r list plot expression substitution

我正在尝试使用

创建一个变化的标签,以显示在多个图表中
labl<-substitute(expression(tau[CODE]),list(CODE=i))[2]

其中i是循环中的索引。

我得到以下内容:

除了“()”之外没什么问题,似乎来自list函数。我无法弄清楚如何摆脱它。我正在使用与无数其他示例中使用的完全相同的代码,并且找不到任何具有相同问题的人。

感谢您的任何提示!

3 个答案:

答案 0 :(得分:3)

/*myChart: The chat itself *showReports: whether to show the "Reports" button. *breadcrumbs: The breadcrumbs to show on top of the page *No response: The message to show to the user if fetching the data fails. */ public myChart: null | Highcharts.ChartObject = null; public showReportsButton: boolean; public breadcrumbs: Array<{ name: string; url: string }>; private NO_RESPONSE_USER_ERROR_MESSAGE = "Sorry, we couldn't get the data for the chart. We don't know what went wrong :("; 已经接受了一个表达式,因此无需将代码包装在substitute中。你可以这样做:

expression

答案 1 :(得分:2)

迈克的解决方案是正确的。但是由于使用R中的表达式是非常不直观的,这里简要解释为什么在子集化时得到无关的()

在对未评估的表达式进行子集化时,R基本上将表达式视为list。您的原始表达式如下所示:

〉 (expr = substitute(expression(tau[CODE]), list(CODE = 1)))
expression(tau[1])
〉 as.list(expr)
[[1]]
expression

[[2]]
tau[1]

现在,在计算expr[2]时,您正在切换该列表,但您的返回值仍然是列表

〉 as.list(expr)[2]
[[1]]
tau[1]

如果您将列表视为未评估的表达式,则R 始终将其转换为函数调用;实际上,在这种情况下,as.callas.list完全相反:

〉 as.call(list(1, 2, 3))
1(2, 3)
# same as just `expr`:
〉 as.call(as.list(expr))
expression(tau[1])

因此:

〉 as.call(as.list(expr)[2])
tau[1]()
# same as:
〉 expr[2]
tau[1]()

那么如何防止这种情况? - 使用列表子集,而不是列表切片

〉 expr[[2]]
tau[1]

因此,在您的代码中使用[[2]]代替[2]会有效。但正如Mike所示,真正的解决方案不是首先将表达式包装到expression中。

答案 2 :(得分:-1)

我相信您需要做的就是将表达式包装在as.character()函数中,如下所示:

> as.character(substitute(expression(tau[CODE]),list(CODE=i))[2])
[1] "tau[1]"