36 创建云端应用
词汇表
| 表达式 | 说明 |
|---|---|
CloudPublish[expr] |
发布到云端 |
Delayed[expr] |
计算延迟到被请求时执行 |
FormFunction[form,function] |
可部署表单的表示 |
FormPage[form,function] |
包含表单与结果页面的表示 |
Wolfram 语言可让你轻松地将自己创作的任何内容发布到网络上。
创建地图采用Albers等积圆锥投影:
wl
In[]:=GeoGraphics[GeoRange -> All, GeoProjection -> "Albers"]

发布到云端
静态
将其发布到云端:
wl
In[]:=CloudPublish[GeoGraphics[GeoRange -> All, GeoProjection -> "Albers"]]

如果你不另行指定,CloudPublish 会在 Wolfram Cloud 中为你创建一个新网页并分配唯一地址。
任何访问该网页的人都会看到你发布的图形。

交互
发布到网络的内容不必是静态图形;
它也可以是交互和动态的。
将交互应用发布到网络:
wl
In[]:=CloudPublish[Manipulate[Graphics[Table[Circle[{0, 0}, r], {r, min, max}]], {min, 1, 30, 1}, {max, 1, 30, 1}]]

会得到一个带有活动滑块等控件的网页,可以在任何标准浏览器中使用,但由于需通过网络通信,其运行速度会比本地运行慢一些。
延迟计算
CloudPublish 通常会先执行能做的计算,然后再将结果放到网上。
例如 CloudPublish[Now] 会创建一个在部署时显示当时时间的网页;
wl
In[]:=CloudPublish[ClockGauge[Now]]
与上例一样,会返回一个带链接的CloudObject对象,点击在页面中显示一个时钟。

如果再次点击链接,上图不会发生变化。
如果想在每次页面被请求时都返回当前时间,可以使用 CloudPublish[Delayed[Now]]。
使用 Delayed 创建每次请求都会重新生成的时钟:
wl
In[]:=CloudPublish[Delayed[ClockGauge[Now]]]

每次访问该网页时,Wolfram Cloud 都会重新生成时钟并将新版本放到网页上。
更新间隔
可以通过指定更新间隔来创建"实时仪表盘"。
让网页每 2 秒自动更新一次:
wl
In[]:=CloudPublish[Delayed[ClockGauge[Now], UpdateInterval -> 2]]
表单函数
除了网站之外,Wolfram 语言也很容易创建基于表单的 Web 应用。
基本思路是设置一个 FormFunction,定义表单结构以及提交时执行的动作。
例如设置一个带有单个名为 name 的字段(期望输入动物名称),提交后生成该动物图像的表单。
创建带单个输入字段(输入动物名称)的表单应用:
wl
In[]:=CloudPublish[FormFunction[{"name" -> "Animal"}, #name["Image"] &]]
访问该地址时你会看到一个表单;

提交表单会得到一张老虎的图片示例。

表单交互
表单还能生成任何内容,例如一个交互的 Manipulate:
从表单生成 Manipulate:
wl
In[]:=CloudPublish[FormFunction[{"name" -> "Animal"}, Manipulate[Rotate[#name["Image"], t], {t, 0, 360 °}] &]]
和老虎示例一样,首先需要输入一个动物,比如猫。
| 初始 | 旋转 |
|---|---|
![]() |
![]() |
多字段表单
表单可以包含任意数量的字段。
对于每个字段,使用与 Interpreter 相同的规范来说明接受的输入类型。
发布一个接受两个数字的表单:
wl
In[]:=CloudPublish[FormFunction[{"x" -> "Number", "y" -> "Number"}, #x + #y &]]

如果向该表单提供非数字输入,会出现错误提示。

字段类型
字段可以期望字符串(String)、整数(Integer)、日期(Date)或其他上百种类型的输入。
智能字段
当请求"真实世界"类型的输入(如 Animal 或 City)时,CloudPublish 会自动为表单创建智能字段,用自然语言理解解释输入。
数字类型
但对于更抽象的类型(如数字),可以选择 Number、SemanticNumber 或 ComputedNumber。
Number只接受明确的数字,如71;SemanticNumber也接受自然语言数字,如seventy-one;ComputedNumber允许需要计算得到的数字,如20th prime number。
允许使用自然语言指定数字:
wl
In[]:=CloudPublish[FormFunction[{"x" -> "SemanticNumber", "y" -> "SemanticNumber"}, #x + #y &]]
Seventy-one 可作为语义数字;要找素数则需要计算型数字。

如果你指定的输入类型是 Image,表单会提供特殊控件来获取图像------例如在移动设备上直接访问相机或相册。
发布一个用于边缘检测的图像应用:
wl
In[]:=CloudPublish[FormFunction[{"photo" -> "Image"}, EdgeDetect[#photo] &]]

在移动设备上,可以直接从相机获取图像。

表单页
FormFunction 可用于创建"一次性"表单:填写、提交并得到结果,若要再得到结果需返回表单再提交。
FormPage 则创建包含表单及结果的页面------类似 Wolfram|Alpha 或搜索引擎。
创建显示城市地图的表单页面:
wl
In[]:=CloudPublish[FormPage[{"city" -> "City"}, GeoGraphics[#city] &]]

可以更改字段并再次提交以获得新结果。
总结
Wolfram语言中的Web应用基于表单构建。
- 表单函数
FormFuction和表单页FormPage通过CloudPublish函数发布到云端。 FormFuction返回结果会跳转页面,而FormPage不会跳转,结果在当前表单页面中显示。- 可以使用规则为表单字段添加数据类型约束。

