Spotfire® 用户指南

排除属性表达式故障

由于能够以两种不同方式插入和解释属性,看似正确的表达式可能无法按预期工作。

注: 此处介绍的某些功能只能使用已安装的 Spotfire 客户端进行创建或访问。 您可以编写 Web 客户端中提到的所有表达式,但已安装客户端有一些浏览器中没有的快捷方式和界面。

“自定义表达式”对话框或“添加计算的列”对话框的“表达式”字段中插入属性时,可能会遇到以下消息。

如果您使用“从属性中设置”向轴添加属性,可能也会遇到一些问题,并且表达式与轴不匹配。在这种情况下,您必须单击鼠标右键并转至“自定义表达式”对话框,以手动更改您的表达式。尝试使用下表确定您的问题。

表达式字段的错误文本 表达式示例 可能的错误 解决方案
表达式不完整。

表达式为空。

无法计算该表达式。

${MyProperty} 在已安装的客户端中,通过单击鼠标右键或单击“插入属性”按钮将属性插入到表达式时,将作为文本插入。

通过此语法,Spotfire 会尝试将字符串属性值视为列名称或表达式的一部分(而不是值)。

如果您想要使用字符串属性的值,请在表达式两边加上引号:

"${MyProperty}"

还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”

DocumentProperty("MyProperty")

如果属性将带有列名称,但列名称包含空格字符,您需要在属性表达式两边加上“[”和“]”字符。您还可以使用 $esc() 函数,可转义任何“]”字符并可将属性字符串转换为列:

$esc(${MyProperty})

如果使用“从属性设置”添加属性,您将会自动获得转义后的表达式版本。

表达式不完整。 Concatenate("My first string", ${EmptyProperty}) 如果作为文本插入的字符串属性为空,则不能被视为列,Spotfire 根本不会看到本示例中的第二个参数。 如果您想要使用字符串属性的值,请在表达式两边加上引号:

Concatenate("My first string", "${EmptyProperty}")

还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”

Concatenate("My first string", DocumentProperty("EmptyProperty"))

如果您想要使用连接中列的内容,应在属性两边加上“[”和“]”字符,以确保属性被视为列 [或按上所述使用 $esc()]。

Concatenate("My first string", [${EmptyProperty}])

函数调用类型“DocumentProperty”无效 DocumentProperty(MyProperty) 应用属性函数时,属性名称应始终写入引号内。

如果使用弹出式菜单(在已安装的客户端中)中的“作为值插入”快捷方式,将会自动添加引号。

在属性名称旁边加上引号:

DocumentProperty("MyProperty")

第 1 行第 12 个字符上应为“表达式结束”,但实际为“,”。

表达式无效

$map("sum([${MyListProperty}])", ",") 在轴上使用列表值属性时,必须将列表值属性映射到单个字符串。

表达式必须包含用于列表中每个值的模板(例如,聚合度量值),也是在结果表达式中应如何连接列表值的规范。

首次插入的属性适用于连续轴(需要包含在列表值属性中的列的简单列表)时,将获得默认表达式。在所有其他情况下,必须手动进行修改。

根据您想要显示的内容,必须对默认表达式略加修改。

如果需要列表名称的简单列表(例如,如果想要在条形图值轴上显示多个列),本示例中的表达式可以正常运行。如果您想要使用不同于“sum”的合并度量值,只需替换表达式中的“sum”。

如果类别轴上显示了列的列表,则必须修改默认表达式,使其如下所示:

<$map("[${MyListProperty}]", "NEST")>

类别表达式的两边必须加上尖括号,"<>”,您还必须指定应如何处理不同的类别组合。

此外,当前在列表值属性中选择的列可能是连续列和类别列的混合。请确保属性列表中仅包含相同类型的列。

还存在更多必须修改表达式的情况。有关详细信息,请参见表达式中的属性下面的列表值属性(多个选择)

第 1 行第 5 个字符上应为“:”,但实际为“3”。 ${TimeSpanProperty} 如果尝试在表达式中使用时间跨度、日期、时间或日期时间属性,此表达式的语言将无法正确解析,需要进行某些手动编辑工作。

首先,需要在属性名称两边加上引号。这样可将属性视为字符串,您可以删掉一些错误。其次,必须使用一个转换函数,以便实际将值视为 TimeSpan、Date、Time 或 DateTime。

在属性名称两边加上引号,并使用相应的转换函数:

TimeSpan("${TimeSpanProperty}")

还可以右键单击“列的可用属性”列表(在已安装的客户端中)中的属性,然后从弹出式菜单中选择“作为值插入”

TimeSpan(DocumentProperty("TimeSpanProperty"))

在 ${{Table} 未定义 {Table ${{Table}}.{MyProperty} 如果名称中包含右大括号 (}),必须用反斜杠 (\) 进行转义 要访问名为“{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。