排除属性表达式故障
由于能够以两种不同方式插入和解释属性,看似正确的表达式可能无法按预期工作。
在“自定义表达式”对话框或“添加计算的列”对话框的“表达式”字段中插入属性时,可能会遇到以下消息。
如果您使用“从属性中设置”向轴添加属性,可能也会遇到一些问题,并且表达式与轴不匹配。在这种情况下,您必须单击鼠标右键并转至“自定义表达式”对话框,以手动更改您的表达式。尝试使用下表确定您的问题。
表达式字段的错误文本 | 表达式示例 | 可能的错误 | 解决方案 |
---|---|---|---|
表达式不完整。 或 表达式为空。 或 无法计算该表达式。 |
${MyProperty} |
在已安装的客户端中,通过单击鼠标右键或单击“插入属性”按钮将属性插入到表达式时,将作为文本插入。 通过此语法,Spotfire 会尝试将字符串属性值视为列名称或表达式的一部分(而不是值)。 |
如果您想要使用字符串属性的值,请在表达式两边加上引号:
还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”:
如果属性将带有列名称,但列名称包含空格字符,您需要在属性表达式两边加上“[”和“]”字符。您还可以使用 $esc() 函数,可转义任何“]”字符并可将属性字符串转换为列:
如果使用“从属性设置”添加属性,您将会自动获得转义后的表达式版本。 |
表达式不完整。 | Concatenate("My first string", ${EmptyProperty}) |
如果作为文本插入的字符串属性为空,则不能被视为列,Spotfire 根本不会看到本示例中的第二个参数。 | 如果您想要使用字符串属性的值,请在表达式两边加上引号:
还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”:
如果您想要使用连接中列的内容,应在属性两边加上“[”和“]”字符,以确保属性被视为列 [或按上所述使用
|
函数调用类型“DocumentProperty”无效 | DocumentProperty(MyProperty) |
应用属性函数时,属性名称应始终写入引号内。 如果使用弹出式菜单(在已安装的客户端中)中的“作为值插入”快捷方式,将会自动添加引号。 |
在属性名称旁边加上引号:
|
第 1 行第 12 个字符上应为“表达式结束”,但实际为“,”。 或 表达式无效 |
$map("sum([${MyListProperty}])", ",") |
在轴上使用列表值属性时,必须将列表值属性映射到单个字符串。 表达式必须包含用于列表中每个值的模板(例如,聚合度量值),也是在结果表达式中应如何连接列表值的规范。 首次插入的属性适用于连续轴(需要包含在列表值属性中的列的简单列表)时,将获得默认表达式。在所有其他情况下,必须手动进行修改。 |
根据您想要显示的内容,必须对默认表达式略加修改。 如果需要列表名称的简单列表(例如,如果想要在条形图值轴上显示多个列),本示例中的表达式可以正常运行。如果您想要使用不同于“sum”的合并度量值,只需替换表达式中的“sum”。 如果类别轴上显示了列的列表,则必须修改默认表达式,使其如下所示:
类别表达式的两边必须加上尖括号,"<>”,您还必须指定应如何处理不同的类别组合。 此外,当前在列表值属性中选择的列可能是连续列和类别列的混合。请确保属性列表中仅包含相同类型的列。 还存在更多必须修改表达式的情况。有关详细信息,请参见表达式中的属性下面的列表值属性(多个选择)。 |
第 1 行第 5 个字符上应为“:”,但实际为“3”。 | ${TimeSpanProperty} |
如果尝试在表达式中使用时间跨度、日期、时间或日期时间属性,此表达式的语言将无法正确解析,需要进行某些手动编辑工作。 首先,需要在属性名称两边加上引号。这样可将属性视为字符串,您可以删掉一些错误。其次,必须使用一个转换函数,以便实际将值视为 TimeSpan、Date、Time 或 DateTime。 |
在属性名称两边加上引号,并使用相应的转换函数:
还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”:
|
在 ${{Table} 未定义 {Table | ${{Table}}.{MyProperty} |
如果名称中包含右大括号 (}),必须用反斜杠 (\) 进行转义。 | 要访问名为“{Table}”的数据表中的数据表属性 MyProperty,必须写入:
|
有关 $esc 和 $csearch 的更多信息
$esc(expression)
$esc()
函数用于转义“]”,通常从列名称中指定了列的末尾,并向列名称添加“[”和“]”。需要使用括号的列名称(包含空格符号)将被视为列。$esc()
可与 $csearch()
函数一起使用。该参数是可成为属性值的表达式,或以美元符号 ($) 开头的属性函数。
例如,让数据表“A Data Table”具有分别名为“Column 1”、“Column 2[example]”和“Sales”的三个列。表达式 $esc($csearch([A Data Table], "Col*"))
将返回具有两个元素的列表 - 字符串“[Column 1]”和“[Column 2[example]]]”。
$csearch([Data Table], "search string")
$csearch()
函数用于生成列名称的“筛选”列表。它允许您使用限制搜索表达式从数据表中选择多个列。此函数可能会与 $map()
函数一起使用。第一个参数是数据表,第二个参数是包含搜索表达式的字符串,该表达式用于决定应返回的列名称。该函数将返回满足搜索表达式的数据表中(非转义)列名称的列表。
例如,让数据表“A Data Table”具有分别名为“Column 1”、“Column 2”和“Sales”的三个列。表达式 $csearch([A Data Table], "Col*")
将返回具有两个元素的列表 - 字符串“Column 1”和“Column 2”。如果属性 MyTable 包含字符串 [A Data Table],并且属性 MyA 包含字符串“Col*”,则 $csearch(${MyTable}, "${MyA}")
将返回相同结果。
$csearch
$map()
和 $esc()
一起使用时,可基于列表值属性中的列生成列的列表或计算。例如,由于搜索表达式 *
将返回表中的所有列,$map("sum($esc($csearch(${MyTable}, "*")))", "+")
将展开为 sum([Column 1])+sum([Column 2])+sum([Sales])
。如果您想要将列表中的字符串视为列,且列名称包含空格字符,则需要 $esc()
函数。
$csearch()
主要是在图表轴表达式中使用或包含在数据函数参数表达式中。虽然 $csearch()
查看数据表中的所有列,包括任何计算列,但在计算列中使用不太合适。如果在计算列中使用,可能会出现循环依赖。预处理器表达式中的数据表或列名称
由于预处理器仅进行文本替换,而没有任何上下文或不知道哪个是列名称、哪个是数字,因此,无法跟踪列名称何时发生了更改。这意味着,如果此类名称发生更改,则必须手动更新预处理器表达式。
- 如果可能,请使用非预处理器语法而不是预处理器语法。例如,如果属性还不是整数,则可以使用
Integer(DocumentProperty("name"))
而不是${name}
来将值转换为整数。 - 如果无法执行此操作,也许您可以使用未重命名的中间列?例如,假设有一个名为 A 的原始列。然后,您可以添加一个带有表达式 [A] 的计算列 B。之后,您可以将 B 与预处理器语法混合来计算 C。替换数据时,A 会重命名为 A2,B 列将正常更新(因为其中没有任何预处理器语法),C 将正常重新进行计算,因为它仅取决于未重命名的 B。