Проблема с кодом Spotfire R (TERR) - ошибка 'list' недопустимого типа индекса - PullRequest
0 голосов
/ 15 мая 2018

Я написал код, который отлично работает в R Studio (3.4.3).Я скопировал код в проект Spotfire (TERR), и он работал нормально один или два раза, но теперь бомбы с ошибкой «Invalid subscript type 'list'».Я обнаружил, что это происходит из строки ниже в функции 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 уже помог мне запустить весь код ранее, поэтому заранее спасибо залюбая дополнительная помощь.При необходимости я могу предоставить набор данных и полное кодирование.

Вот сообщение об ошибке в полном объеме: Сгенерировано сообщение об ошибке

1 Ответ

0 голосов
/ 18 мая 2018

Мне удалось найти решение моей проблемы с помощью DougJ на веб-сайте сообщества Tibco. Ниже приведен тестовый набор, который DougJ выполнил для определения источника проблемы из data.frame(P), который содержал пустые ячейки. Обратите внимание, что data.frame(P) состоит примерно из 120 строк на итерацию, а data.frame(S) имеет более 300 строк на итерацию. Моим решением для разницы в размерах фреймов данных было утверждение resultGT <- outer(S, P, ">=") с последующим оператором minGT <- rownames(resultGT)[apply(resultGT, 2, which.min)], чтобы найти минимальные значения "S" для каждого отдельного значения "P". Это работало безупречно в RStudio, но вызвала ошибку в Spotfire с TERR.

#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!

...