首页 > 解决方案 > 使用 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此类过程的最佳方法?

标签: rctcl

解决方案


当您的 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 命令,您几乎必须处理异常。失败是生活中的事实,您需要在健壮的代码中考虑到它们。


推荐阅读