r - 使用 C 库中的 TclTK 返回整数
问题描述
我有使用 Tcl/Tk 库的 C 代码。然后我使用这个 C 代码创建一个库,然后将其链接到 R 语言包。我在 C 代码中有一个函数:
int doSomething(){
if(TRUE){
return TCL_OK;
else{
TCL_RESULT3("Error")
return TCL_OK;
}
目前,我TCL_RESULT3("Error")
在 C 代码中使用,然后在 R 中检查是否result <- tclvalue(tcl(...)) #calls doSomething()
返回一个字符串Error
:
if (startsWith(result, "Error"))
{
return(FALSE)
}
return(TRUE)
并将 R 中的进一步操作基于返回的值。
然而,即使有错误,我仍然调用TCL_OK
,因为TCL_ERROR
产生了 R 似乎无法处理的东西(至少它并不简单)。我的问题是是否可以将我的功能重组为:
int doSomething(){
if(TRUE){
return TCL_OK;
else{
return TCL_ERROR;
}
并让 R 了解返回的内容。目前,如果TCL_OK
返回,那么result
将是一个空字符串""
。如果TCL_ERROR
返回,则结果将产生:Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] .
R 不知道如何处理。
是否有可能让 R 处理这样的错误(即,如果弹出此错误,则返回 FALSE 值)或者正在检查错误消息TCL_RESULT3()
,并结合使用TCL_OK
此类过程的最佳方法?
解决方案
当您的 C 代码返回TCL_ERROR
(而不是TCL_OK
)时,这是一个错误条件,这在逻辑上类似于其他语言中的异常。R能处理这些吗?是的(显然;我对 R 知之甚少)。这是一种方法(当然还有其他方法;正确的选择取决于您在做什么以及异常的可能原因)。
result <- tryCatch(
{
# This is where you put in the code to call into Tcl
tclvalue(tcl(...)) # calls doSomething()
},
error = function(err) {
message(paste("error occurred in Tcl code:", err))
return(NaN) # Need an alternative result value here
}
)
请注意,如果您正在调用任意 Tcl 命令,您几乎必须处理异常。失败是生活中的事实,您需要在健壮的代码中考虑到它们。
推荐阅读
- spring - 如何使用 JUnit 和 Mockito 测试我的 JwtAuthentication 类?
- node.js - MongoError:以度为单位的边缘位置
- php - 想要在不点击按钮的情况下从 HTML 输入文本更新数据库值
- c# - 在构造函数中填充数组
- r - 如何使用数据框中的数据点(坐标)提取栅格(在本例中为土地覆盖类型)中的像元值
- java - htmlUnit - 是否可以只执行特定的 JS 函数?
- r - Rcpp 在两个函数之间共享相同的 roxygen
- .net - 单元测试多目标框架:测试所有框架
- c# - 我们如何从左到右计算出现次数并继续直到我们有连续的数字?
- python - __init__.py 中的类实现