Spotfire R代码(TERR)问题 - 无效的下标类型' list'错误

时间:2018-05-14 22:30:45

标签: r apply spotfire subscript terr

我编写的代码在R Studio(3.4.3)中完美运行。我将代码复制到一个Spotfire项目(TERR)中,并且它运行了一两次,但现在使用"无效的下标类型'列表'"错误。我已经确定它来自apply函数中的以下行。

minGT <- as.numeric(rownames(resultGT)[apply(resultGT , 2, which.min)])

我花了几天时间尝试在SO和其他地方找到的潜在解决方案无济于事。下面是一些代码块,为了阅读而减少:

###Code revised previously after SO (@Parfait) assistance - different problem##
library(plyr)

DS <- DirectionalSurveys[, c("IDWELL", "API", "WELL NAME", "DIVISON", "MD", "INCL", "AZIM", "NS", "EW", "TVD", "DLS", "Northing", "Easting")]
Perf <- Perforation[, c("IDWELL", "Well API Number", "Well Name", "County", "Mid Perf MD", "Mid Perf TVD")]
colnames(DS) <- c("IDWELL", "API", "WellName", "Division", "MD", "INCL", "AZIM", "NS", "EW", "TVD", "DLS", "Northing", "Easting")
colnames(Perf) <- c("IDWELL", "API", "WellName", "County", "MidPerfMD", "MidPerfTVD")

df_lists <- lapply(seq_along(WellName), function(i) {

    S <- DS$MD[DS$WellName == WellName[i]]
    P <- Perf$MidPerfMD[Perf$WellName == WellName[i]]

    resultGT <- outer(S, P, '>=')
    resultGT[resultGT == FALSE] <- 50
    rownames(resultGT) <- paste0(S)
    colnames(resultGT) <- paste0(P)

#This is the line that throws the error - specifically the `apply` function

    minGT <- as.numeric(rownames(resultGT))[apply(resultGT , 2, which.min)]

#Calculations begin below after some additional subsetting (not shown)
    deep <- S[match(minGT, S)]
    shallow <- S[match(minGT, S) - 1]
#............etc.
#Remainder of code removed to prevent recipient boredom....

我非常感谢一些(更多)帮助 - @Parfait已经帮助我以前运行了整个代码,所以提前感谢任何其他帮助。我可以根据需要提供数据集和完整编码。

以下是完整的错误消息: Error message generated

1 个答案:

答案 0 :(得分:0)

在Tibco社区网站的DougJ的帮助下,我能够找到解决问题的方法。以下是DougJ执行以确定问题来源的测试集来自包含空单元格的data.frame(P) - 请注意data.frame(P)每次迭代大约120行,data.frame(S)结束时每次迭代300行。我对数据帧大小差异的解决方案是语句resultGT <- outer(S, P, ">="),后续语句minGT <- rownames(resultGT)[apply(resultGT, 2, which.min)]为每个单独的“P”值找到“S”的最小值。这在RStudio中完美运行,但在TERR中将错误抛到Spotfire中。

#Test case below as performed by DougJ (Tibco Community) that identified problem area.
> xNA <- c(1:2, NA, 3:4)
> yNA <- c(3:5, NA, 6)
> 
> xNA
[1]  1  2 NA  3  4
> 
> yNA
[1]  3  4  5 NA  6
> 
> resultGT <- outer( xNA, yNA, ">=" )
> 
> resultGT[resultGT == FALSE] <- 50
> 
> rownames( resultGT ) <- paste0(xNA)
> colnames( resultGT ) <- paste0(yNA)
> 
> resultGT
  3  4  5 NA  6
1  50 50 50 NA 50
2  50 50 50 NA 50
NA NA NA NA NA NA
3   1 50 50 NA 50
4   1  1 50 NA 50
> 
> 
> apply(resultGT, 2, which.min)
$`3`
3 
4 

$`4`
4 
5 

$`5`
1 
1 

$`NA`
integer(0)

$`6`
1 
1 

> class( apply(resultGT, 2, which.min) )
[1] "list"
> 
> 
> as.numeric(rownames(resultGT))
[1]  1  2 NA  3  4
Warning message:
NAs introduced by coercion 
> 
> as.numeric(rownames(resultGT))[ apply(resultGT, 2, which.min) ]
Error in as.numeric(rownames(resultGT))[apply(resultGT, 2, which.min)] : 
  invalid subscript type 'list'
In addition: Warning message:
NAs introduced by coercion 
> 

以下是DougJ作为解决方案开发的最终代码:

#original code:
minGT <- rownames(resultGT)[apply(resultGT , 2, which.min)]

#new code (with slight modification):
minGT <- rownames(resultGT)[apply(resultGT, 2, function(X) {tmp <- which.min(X); ifelse(length(tmp), tmp, NA)} )]

现在可以在Spotfire中使用TERR。感谢DougJ如果你在SO!