R-opencpu中construction_decimal函数结果无法在HTML中显示的问题
问题背景与代码信息
更新记录
2023年10月26日
以下是construction_decimal函数的两个使用示例:
construction_decimal("2'-0\"", result = "traditional", output = "vector") # [1] 2 construction_decimal("1'-2 7/16\"", result = "librecad", output = "vector") # [1] 14.4375
完整函数代码可查看对应R包内的construction_fraction.R文件。
2023年10月25日
已为R包iemisc中的construction_decimal函数开发HTML界面,对应页面文件已完成编写。
问题现象
opencpu日志显示请求正常,本地服务器返回的JSON结果也正确,但函数结果无法显示在id为finished的HTML段落中。当前使用的JavaScript回调函数尝试将结果赋值给该段落,但页面始终空白,需要优化返回结果的显示逻辑。
相关代码
JavaScript代码
// 页面加载完成后初始化脚本 $(document).ready(function(){ $("#submitbutton").on("click", function(){ // 禁用按钮防止重复点击 $("#submitbutton").attr("disabled", "disabled"); // 读取'measurement'参数值 var measurement = $("#measurementfield").val(); // 读取'result'参数值 var result = $("#resultfield").val(); // 读取'output'参数值 var output = $("#outputfield").val(); // 发起请求 var req = ocpu.rpc("construction_decimal", { measurement : measurement, result : result, output : output, }, function(finished){ $("#finished").text(finished.message); }); // R返回错误时弹出提示 req.fail(function(){ alert("服务器错误: " + req.responseText); }); // 请求完成后重新启用按钮 req.always(function(){ $("#submitbutton").removeAttr("disabled") }); }); });
HTML结果段落代码
<p id="finished"></p>
解决方案
问题核心在于回调函数对返回值的处理逻辑错误:当设置output = "vector"时,R函数返回的是单元素数值向量,而非带有message属性的对象,直接访问finished.message会得到undefined,导致段落内容为空。
优化后的回调逻辑
function(finished){ // 先打印返回结果到控制台,方便调试查看结构 console.log("服务器返回结果:", finished); let displayText; // 判断返回值类型:如果是数组(对应R的向量输出),取第一个元素 if(Array.isArray(finished)){ displayText = finished[0]; } // 如果是带message属性的对象,取message值 else if(finished && finished.message){ displayText = finished.message; } // 默认情况直接转为字符串显示 else { displayText = String(finished); } $("#finished").text(displayText); }
替换原回调函数后,即可正确渲染函数返回的结果。
内容的提问来源于stack exchange,提问作者iembry
相关产品推荐
相关产品推荐

