在TERR中运行apply()时“下标超出界限”,但在普通R中工作

时间:2014-06-04 13:15:15

标签: r spotfire terr

当我尝试在Spotfire Professional中运行以下代码作为" R脚本 - 用于R&#34的Tibco Enterprise Runtime时:

mydata_broken <- structure(
  list(
    Var1 = list(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391), 
    Var2 = list(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391)), 
  row.names = c("1", "2", "3", "4"), 
  class = "data.frame", 
  out.attrs = list(dim = c(2L, 2L), 
                   dimnames = list(
                     Var1 = c("Var1=3.99083333270391", "Var1=3.99083333270391"), 
                     Var2 = c("Var2=3.99083333270391", "Var2=3.99083333270391")
                     )
                   )
  )

mydata_ok <- structure(
  list(
    Var1 = list(3.99083333270391), 
    Var2 = list(3.99083333270391)), 
  row.names = "1", 
  class = "data.frame", 
  out.attrs = list(dim = c(1L, 1L), 
                   dimnames = list(
                     Var1 = "Var1=3.99083333270391", 
                     Var2 = "Var2=3.99083333270391")
                   )
  )

out <- apply(mydata_broken, 1, function(y) mean(as.numeric(y)))

我收到以下错误消息:

TIBCO Enterprise Runtime for R返回错误:&#39; expand.names(x)出错:下标超出范围&#39;。 在Spotfire.Dxp.Data.DataFunctions.Executors.LocalFunctionClient.OnExecuting(FunctionClient funcClient)

(其余的堆栈跟踪省略)

然而,相同的代码在简单的R中完美地工作。 如果我在mydata_broken的调用中将mydata_ok替换为apply(),则一切都按预期工作(在TERR和普通R中)。

到目前为止我尝试过的事情:

版本&amp;配置信息

  • Spotfire 5.5.0,构建版本5.5.0.31,构建日期:22.05.2013
  • R版本3.0.2,64位(2013-09-25)
  • Windows 7,64位

所以,我的问题是:我在这里犯了一些愚蠢的错误吗?或者这是Spotfire R运行时中的错误?

更新 我想重新打开这个问题,因为我从Spotfire支持中获得了可行的解决方法,并且我想将其添加为答案。

1 个答案:

答案 0 :(得分:2)

以下是我从Spotfire支持部门得到的回复的简短摘要:

  • 它确实是TERR中的一个错误(显然,TERR无法正确读取list()结构,导致它应该创建的矩阵的尺寸错误);他们目前正在努力修复它
  • 作为变通方法,您可以在数据定义中使用c()代替list()

修改了TERR中的数据定义

mydata_working <- structure(
    list(
      Var1 = c(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391), 
      Var2 = c(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391)), 
    row.names = c("1", "2", "3", "4"), 
    class = "data.frame", 
    out.attrs = list(dim = c(2L, 2L), 
                     dimnames = list(
                       Var1 = c("Var1=3.99083333270391", "Var1=3.99083333270391"), 
                       Var2 = c("Var2=3.99083333270391", "Var2=3.99083333270391")
                       )
                     )
    )