使用子表达式组合函数编辑

您可能已经在其他部分的示例中注意到另一种语法,即花括号内的表达式。这些被称为子表达式,它们可以用来为另一个表达式提供一个计算值,而不是一个静态值。

一个简单的例子是,当您将自己的图像上传到 Canvas 工作区时。该上传将成为一个资源,并且可以使用 asset 函数检索该资源。通常,您只需从 UI 中执行此操作,将图像元素添加到页面,然后从侧边栏的控件中上传图像,或者从那里选择现有资源。在这两种情况下,系统都将通过 asset 函数使用该资源,最终您将得到一个类似于以下内容的表达式

image dataurl={asset 3cb3ec3a-84d7-48fa-8709-274ad5cc9e0b}

子表达式在使用它们的函数执行之前执行。在这种情况下,asset 将首先运行,它将生成一个值,即图像的 base64 编码值,该值将用作 图像 函数中 dataurl 参数的值。在 asset 函数执行后,您将获得以下输出

image dataurl="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0"

由于所有子表达式现在都解析为实际值,因此可以执行 图像 函数以生成其 JSON 输出,就像之前解释的那样。对于图像,嵌套子表达式的能力对于有条件地显示多个图像之一特别有用。例如,您可以通过混合使用 if 函数,根据某些计算值在两个图像之间切换,如下面的示例表达式所示

demodata
| image dataurl={
  if condition={getCell price | gte 100}
    then={asset "asset-3cb3ec3a-84d7-48fa-8709-274ad5cc9e0b"}
    else={asset "asset-cbc11a1f-8f25-4163-94b4-2c3a060192e7"}
}

本节中的示例不能直接复制和粘贴,因为整个过程中使用的值在您的工作区中不存在。

在这里,用于 condition 参数值的表达式 getCell price | gte 100 首先运行,因为它嵌套得更深。

该表达式执行以下操作

  • demodata 数据表的第一行中的 价格 列中检索值
  • 将值输入到 gte 函数
  • 将值与 100 进行比较
  • 如果值大于或等于 100,则返回 true,如果值小于或等于 100,则返回 false

该布尔值将成为 condition 参数的值。当 conditiontrue 时,then 表达式的输出将用作输出。当 condition 为 false 时,将使用 else 表达式的输出。在这两种情况下,都将返回一个 base64 编码的图像,并且将显示两个图像之一。

您可能想知道子表达式中的 getCell 函数如何访问 demoData 函数中的数据,即使 demoData 没有直接插入到 getCell 中。答案很简单,但理解起来很重要。当嵌套的子表达式被执行时,它们会自动接收与其父函数接收到的相同的_上下文_,或者说是前一个函数的输出。在这个特定的表达式中,demodata 的数据表会自动提供给嵌套表达式的 getCell 函数,这使得该表达式能够提取一个值并将其与另一个值进行比较。

_上下文_的传递是自动的,无论您嵌套子表达式的深度如何,都会发生这种情况。为了演示这一点,让我们稍微修改一下表达式,使用 all 函数将价格值与多个条件进行比较。

demodata
| image dataurl={
  if condition={getCell price | all {gte 100} {neq 105}}
    then={asset 3cb3ec3a-84d7-48fa-8709-274ad5cc9e0b}
    else={asset cbc11a1f-8f25-4163-94b4-2c3a060192e7}
}

这一次,getCell price 被运行,结果作为上下文传递给下一个函数。然后,all 函数的每个子表达式都被运行,上下文被赋予它们的父级,在本例中是 getCell price 的结果。如果所有这些子表达式的计算结果都为 true,则 if 条件参数将为 true。

子表达式看起来可能有点陌生,特别是如果您不是开发人员,但它们值得您熟悉,因为它们提供了强大的功能和灵活性。由于您可以嵌套任何您想要的表达式,因此您也可以使用此行为来混合来自多个索引的数据,甚至来自多个来源的数据。例如,您可以查询 API 以获取一个值,并将其用作提供给 essql 的查询的一部分。

整个部分实际上只是触及了皮毛,但希望在阅读之后,您至少了解如何阅读表达式并理解它们在做什么。稍加练习,您就可以掌握将_上下文_和子表达式混合在一起,将任何输入转换为所需输出的技巧。