当我尝试在 Spotfire Professional 中将以下代码作为“R 脚本 - Tibco Enterprise Runtime for R”运行时:
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)))
我收到以下错误消息:
R 的 TIBCO Enterprise Runtime 返回错误:“expand.names(x) 中的错误:下标超出范围”。 在 Spotfire.Dxp.Data.DataFunctions.Executors.LocalFunctionClient.OnExecuting(FunctionClient funcClient)
(省略堆栈跟踪的其余部分)
但是,相同的代码在普通 R 中可以完美运行。
如果我在对 apply()
的调用中将 mydata_broken
替换为 mydata_ok
,一切都会按预期工作(无论是在 TERR 还是普通 R 中)。
到目前为止我尝试过的事情:
- 在提供给
apply()
的匿名函数中使用yy
而不是y
(以排除有关的一些愚蠢的命名问题y
) - 将所有内容放入
local({...})
block 中,并在 R 中检查它,如 why a "subscript out of bounds" error in Shiny, but not R? 中的建议。
版本和配置信息
- Spotfire 5.5.0,构建版本 5.5.0.31,构建日期:2013 年 5 月 22 日
- R 版本 3.0.2,64 位 (2013-09-25)
- Windows 7,64 位
所以,我的问题是:我在这里犯了一些愚蠢的错误吗?或者这是 Spotfire R 运行时中的一个错误?
更新 我想重新讨论这个问题,因为我从 Spotfire 支持那里获得了可行的解决方法,并且我想将其添加为答案。
最佳答案
以下是我从 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")
)
)
)
关于r - 在 TERR 中运行 apply() 时为 "Subscript out of bounds",但在普通 R 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24038497/