我正在尝试使用
创建一个变化的标签,以显示在多个图表中labl<-substitute(expression(tau[CODE]),list(CODE=i))[2]
其中i是循环中的索引。
我得到以下内容:
除了“()”之外没什么问题,似乎来自list函数。我无法弄清楚如何摆脱它。我正在使用与无数其他示例中使用的完全相同的代码,并且找不到任何具有相同问题的人。
感谢您的任何提示!
答案 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基本上将表达式视为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.call
与as.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]"