Return 使用 C 库中的 TclTK 的整数

Return integer using TclTK from C library

我有使用 Tcl/Tk 库的 C 代码。然后我使用这个 C 代码创建一个库,然后链接到 R 语言包。我在 C 代码中有一个函数:

int doSomething(){
   if(TRUE){
      return TCL_OK;
   else{
      TCL_RESULT3("Error")
      return TCL_OK;
}

目前,我在 C 代码中使用 TCL_RESULT3("Error"),然后在 R 中检查 result <- tclvalue(tcl(...)) #calls doSomething() return 是否包含 Error:

的字符串
if (startsWith(result, "Error"))
        {
            return(FALSE)
        }
        return(TRUE)

并根据 returned 值在 R 中进行进一步的操作。

然而,即使有错误,我仍然调用 TCL_OK 因为 TCL_ERROR 产生了一些 R 似乎无法处理的东西(至少它不是直截了当的)。我的问题是是否可以将我的功能重组为:

int doSomething(){
   if(TRUE){
      return TCL_OK;
   else{
      return TCL_ERROR;
}

并让 R 了解正在 return编辑的内容。目前,如果 TCL_OK 被 return 编辑,那么 result 将是一个空字符串 ""。如果 TCL_ERROR 是 returned,那么结果将产生:Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] . R 不知道如何处理。

是否可以让 R 处理此类错误(即 return 如果弹出此错误,值为 FALSE)或正在使用 TCL_RESULT3() 结合 [= 检查错误消息17=] 这种过程的最佳方法?

当您的 C 代码 returns TCL_ERROR(而不是 TCL_OK)这是一个错误条件,这在逻辑上类似于其他语言中的异常。 R 能处理这些吗? Yes(显然;我对 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 命令,您几乎必须处理异常。失败是生活中不可或缺的事实,您需要在健壮的代码中允许失败。