У меня нет ваших данных, поэтому я спроецирую то, что, по моему мнению, ведет к проблеме.
Ссылка на caremeasures[11, 17, 23]
, вероятно, не делает то, что вам нужно, и поэтому возвращать то, чего вы не ожидаете. Попробуйте с caremeasures[,c(11, 17, 23)]
.
Я постараюсь показать, что происходит, используя mtcars
:
requiredOutcomes <- mtcars[1,2,3]
requiredOutcomes
# [1] 6
requiredOutcomes[1,2]
# Error in requiredOutcomes[1, 2] : incorrect number of dimensions
Поскольку mtcars
- это data.frame
, ваш [
индексирование использует [.data.frame
под капотом. Это переводит что-то вроде
# equivalent
mtcars[1, 2]
`[.data.frame`(mtcars, 1, 2)
«Аргументы» (да, это просто обычная функция):
str(formals(`[.data.frame`))
# Dotted pair list of 4
# $ x : symbol
# $ i : symbol
# $ j : symbol
# $ drop: language if (missing(i)) TRUE else length(cols) == 1
, что означает, что ваши 11, 17, 23
аргументы фактически
`[.data.frame`(requireOutcomes, 11, 17, 23)
, который применяется к аргументам как
`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = 23)
Хорошо, поэтому x=
имеет смысл (данные). i=
дает выбор строки (11), а j=
- выбор столбца. Однако, когда R ожидал logical
, тогда все, что не равно нулю, считается TRUE
, так что это фактически
`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = TRUE)
, которое полностью теряет ваши намерения (я подозреваю), возвращая скаляр (одно значение, вектор длины 1 в R). Примечание: если бы вы использовали 0
или FALSE
, вы бы вернули data.frame
с 1 строкой и 1 столбцом.
Вот метод для отладки того, что происходит, чтобы вы могли найди это для себя в следующий раз.
myfunc <- function(x) {
res <- x[1,2,3]
return(res[1:3,])
}
myfunc(mtcars)
# Error in res[1:3, ] (from #3) : incorrect number of dimensions
Хорошо, мы видим ту же ошибку. Мы будем использовать debug(myfunc)
(независимо от того, как называется ваша функция), хотя вы можете добиться аналогичных результатов, поместив browser()
в определенное c место в вашей функции.
debug(myfunc)
myfunc(mtcars)
# debugging in: myfunc(mtcars)
# debug at #1: {
# res <- x[1, 2, 3]
# return(res[1:3, ])
# }
# Browse[2]>
Мы сейчас в отладчике R, что дает нам отслеживание выполнения шага. Ввод n
выполняет строку n
ext; Вы можете прочитать больше команд с помощью ?browser
.
n
# debug at #2: res <- x[1, 2, 3]
# Browse[2]>
n
# debug at #3: return(res[1:3, ])
# Browse[2]>
res
# [1] 6
(«debug at» показывает следующую строку, которая будет выполнена, поэтому мы еще не выполнили return(...)
. С этим мы можем видеть, что res
- который мы считаем data.frame
- это просто одно число. Да. Теперь посмотрите на код и выясните, что произошло. Для меня (и в этом простом примере) это явно x[1,2,3]
, это проблема.