#r #function #syntax
#r #функция #синтаксис
Вопрос:
У меня синтаксическая ошибка в коде функции R, и я не могу ее найти. До того, как я превратил ее в функцию, она работала нормально. Я новичок в R, и это первая значимая функция, которую я создал (после создания меньших тестовых функций).
Я не смог найти ни одного несоответствующего ], } или). «else» не начинается с новой строки. Не удалось найти пропущенные запятые. Внутри строк нет кавычек. Нет фигурных кавычек. Нет нестандартных имен. Я искал предложения в stackoverflow и пришел к выводу, что где-то должна быть синтаксическая ошибка. Любые предложения были бы с благодарностью приняты. Строки, в которых появляется сообщение об ошибке, находятся непосредственно ниже, а код функции — под ним.
> library(stringr)
Warning message:
package ‘stringr’ was built under R version 3.5.2
> setwd("C:/Users/New BioC")
> source("R/match degenerate bases.R")
Error in source("R/match degenerate bases.R") :
R/match degenerate bases.R:43:61: unexpected ']'
# Function mat.degen.base takes custom BLAST output, checks each record for degenerate bases in the hit sequence, and eliminates records for which the query matches all of the degenerate bases in a record. num.mis is the number of mismatched base pairs in the record. mis.loc is a vector of integers for each record that indicates where the mismatches occurred in the query.
# Input to mat.degen.base is a dataframe constructed from the custom output.
# Output from mat.degen.base is a new dataframe with the same structure as the input dataframe, eliminating records with no mismatches, and changing the number and locations of any remaining mismatches in the record.
mat.degen.base <- function(df1)
{
degen.mat.list <- list(R= c('A', 'G'), Y= c('C', 'T'), N= c('A', 'T', 'C', 'G'), W= c('A', 'T'), S= c('C', 'G'), M= c('A', 'C'), K= c('T', 'G'), B= c('T', 'C', 'G'), H= c('A', 'T', 'C'), D= c('A', 'T', 'G'), V= c('A', 'C', 'G') )
degen.list <- (list('R', 'Y', 'N', 'W', 'S', 'M', 'K', 'B', 'H', 'D', 'V'))
patR <- 'R'; patY <- 'Y'; patN <- 'N'; patW <- 'W'; patS <- 'S'; patM <- 'M'; patK <- 'K'; patB <- 'B'; patH <- 'H'; patD <- 'D'; patV <- 'V'
subhit <- df1$REF.hit.
# creates a logical vector with length = nrows of df1; TRUE for any record with a degenerate base, FALSE if all are normal bases
degen <- (grepl(patR, subhit)|grepl(patY, subhit)|grepl(patN, subhit)|grepl(patW, subhit)|grepl(patS, subhit)|grepl(patM, subhit)|grepl(patK, subhit)|grepl(patB, subhit)|grepl(patH, subhit)|grepl(patD, subhit)|grepl(patV, subhit) )
df2 <- df1[!degen,] #selects the rows with normal bases (and therefore, mismatches)
degen.data <- df1[degen,] # selects the rows with degenerate bases
mismat.degen.data <-data.frame() # empty dataframe to store the rows of degen.data with mismatches
for(i in 1:nrow(degen.data)) # processes degen.data line by line (O(n2) slow)
{
subhit <- df1[i, 'REF.hit.']
subque <- df1[i, 'ALT.query.']
nch <- nchar(subhit)
ncq <- nchar(subque)
if(nch>1) {
subhit <- substring(subhit, 1:nch, 1:nch) # split REF(hit) into a vector of single characters
subque <- substring(subque, 1:ncq, 1:ncq) # split ALT(query) into a vector of single characters
} # end if(nch>1)
# check for correct matches to the degenerate bases
degen.hit <- which(subhit %in% degen.list) #locations in hit with degenerate base
mat.list <- logical(length=length(degen.hit)) # initializes logical vector to keep mismatches
for(j in 1:length(degen.hit)) {
degen.tar <- which(degen.list %in% subhit[[degen.hit[[j]] ]]) #identity of degenerate base
if(degen.hit[[j]] <= length(subque)) {
mat <- subque[[degen.hit[[j]] ]] %in% degen.mat.list[[degen.tar]] #base match
} else {mat <- FALSE} # length difference means there is no match
if(mat) {
degen.data[i, 'num.mis'] <- degen.data[i, 'num.mis'] - 1 #reduce mismatch count
mat.list[[j]] <- mat # indexes in degen.hit with matches
} # end if(mat)
} #end for j
degen.data[[i, 'mis.loc']] <- degen.data[[i, 'mis.loc']][!mat.list] #drops indexes with matches
if(degen.data[i, 'num.mis']>0) {mismat.degen.data <- rbind(mismat.degen.data,degen.data[i,])} #some do not match, including normal bases
} #end for i
df2 <- rbind(df2, mismat.degen.data)
df2 <- df2[with(df2, order(Numquery, hit.index, query.POS), ] # sort df2
df2
}
Комментарии:
1. В предпоследней строке у вас есть
, ]
, что, похоже, не сработает, и также отсутствует)
. Скобка открывается наwith(
, затем другая наorder(
, но закрыта только одна. Кроме того, отступ — ваш друг. Этот блок кода очень трудно прочитать.2. Я настоятельно рекомендую следовать руководству по стилю при написании кода. Это помогает нам помочь вам, и это, скорее всего, поможет вам найти те, которые отсутствуют
]
или)
.3. Что касается отступов, исходный код имеет отступ, но когда R создает файл функции, он удаляет мои отступы. Есть ли какой-нибудь способ сохранить ее?
4. Спасибо, что увидели отсутствующее «)». Почему-то я продолжал этого не видеть.