#r #function #class
#r #функция #класс
Вопрос:
Я создал небольшую функцию для обработки фрейма данных, чтобы иметь возможность использовать функцию:
preprocessCore::normalize.quantiles()
Поскольку normalize.quintles() может использовать только объект matrixc, и мне нужно изменить порядок моих данных, я создаю небольшую функцию, которая принимает определенный столбец (переменную) в определенном фрейме данных и выполняет следующее:
normal<-function(boco,df){
df_p1<-subset(df,df$Plate==1)
df_p2<-subset(df,df$Plate==2)
mat<-cbind(df_p1$boco,df_p2$boco)
norm<-preprocessCore::normalize.quantiles(mat)
df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
return(df_1)
}
Однако «mat» должен быть матрицей, но, похоже, cbind() не выполняет свою работу, поскольку я получаю следующую ошибку:
normal(antitrombina_FI,Six_Plex_IID)
Error in preprocessCore::normalize.quantiles(mat) :
Matrix expected in normalize.quantiles
Итак, ясно, что cbind() не создает матрицу. Я не понимаю, почему это происходит.
Комментарии:
1.
cbind
является методом класса S3. Существует метод для обоихmatrix
, иdata.frame
поэтому, если ввод являетсяdata.frame
выходом, также будетdata.frame
. Вы могли бы попробовать использоватьas.matrix
на своемmat
объекте.2. Если вам нужна дополнительная помощь, чем хорошая рекомендация Оливера, пожалуйста, поделитесь достаточным количеством данных, чтобы сделать небольшой воспроизводимый пример, демонстрирующий проблему.
3. Оливер, я пробовал это, это не работает. Я не уверен, почему, но он не создает матрицу, он делает некоторые странные вещи. Я также не уверен, верно ли ваше утверждение. Я могу создать матрицу из фреймов данных с помощью cbind. однако я не знаю почему, внутри функции он создает df, а не матрицу…
Ответ №1:
Скорее всего, вы связываете два нулевых объекта вместе, получая NULL, который не является матрицей. Если ваши df
объекты data.frame
, то df_p1$boco
интерпретируется как «извлечь переменную с именем boco
«, а не «извлечь переменную, имя которой является значением объекта, имеющего символ boco
«. Я подозреваю, что ваши данные не содержат переменной с буквальным именем «boco», поэтому df_p1$boco
оценивается как NULL.
Если вы хотите извлечь столбец, который задается в качестве значения формального аргумента boco
в функции normal()
, тогда вам следует использовать [[
, а не $
:
normal<-function(boco,df){
df_p1<-subset(df,df$Plate==1)
df_p2<-subset(df,df$Plate==2)
mat<-cbind(df_p1[[boco]],df_p2[[boco]])
norm<-preprocessCore::normalize.quantiles(mat)
df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
return(df_1)
}
Комментарии:
1. О, мне нравится этот ответ. Очень хорошая догадка, бьюсь об заклад, вы правы!
Ответ №2:
Спасибо за вашу помощь, bcarlsen. Однако я обнаружил некоторые ошибки:
Во-первых, я считаю, что вам нужно ввести кавычки в
mat<-cbind(df_p1[["boco"]],df_p2[["boco"]])
Если я запускаю этот скрипт вне функции, он работает идеально:
df_p1<-subset(Six_Plex_IID,Six_Plex_IID$Plate==1)
df_p2<-subset(Six_Plex_IID,Six_Plex_IID$Plate==2)
mat<-cbind(df_p1[["antitrombina_FI"]],df_p2[["antitrombina_FI"]])
norm<-preprocessCore::normalize.quantiles(mat)
Однако, если я введу это сейчас в функцию и попытаюсь запустить ее как функцию:
normal<-function(boco,df){
df_p1<-subset(df,df$Plate==1)
df_p2<-subset(df,df$Plate==2)
mat<-cbind(df_p1[["boco"]],df_p2[["boco"]])
norm<-preprocessCore::normalize.quantiles(mat)
df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
return(df_1)
}
normal(antitrombina_FI,Six_Plex_IID)
Я получаю то же сообщение об ошибке:
Error in preprocessCore::normalize.quantiles(mat) :
Matrix expected in normalize.quantiles
Я совершенно не понимаю, почему это происходит, почему вне функции я получаю матрицу и почему внутри функции нет.
Спасибо
Комментарии:
1.Не заключайте
boco
в кавычки[[
внутри функции.normal(antitrombina_FI,Six_Plex_IID)
являетсяnormal(boco = antitrombina_FI, df = Six_Plex_IID)
; т. е.antitrombina_FI
сопоставляется с формальным аргументомboco
normal() . Значением символаboco
в вызове вашей функции является вектор символов «antitrombina_FI».df_p1[["boco"]]
означает «получить переменную с именем «boco» из объекта df_p1″. Это значение равно НУЛЮ, поскольку в df_p1 нет переменной с именем «boco». у df_p1 есть переменная с именем «antitrombina_FI», которая является значением объектаboco
в области действия функции.2.
df_p1[["boco"]]
= получить переменнуюdf_p1
с именем «boco». Если в этом нет переменной с буквальным именем «boco»df_p1
, возвращает значение NULL.df_p1[[boco]]
= получить переменную ofdf_p1
с именем, равным значению объектаboco
. Еслиboco
в доступной среде нет объекта, это вызовет исключение. Внутри функции есть объект с символомboco
, потомуboco
что это имя одного из формальных аргументов.cbind(NULL, NULL)
возвращает значение NULL.normalize.quantiles(cbind(NULL, NULL))
выдает исключение, поскольку NULL не является матрицей.