49 lines
1.6 KiB
R
49 lines
1.6 KiB
R
#' @title Convert Matlab function to R
|
|
#' @description Performs basic syntax conversion from Matlab to R
|
|
#' @param filename name of the file
|
|
#' @param saveOutput if `TRUE`, `filename` is overwritten. Defaults to `FALSE`
|
|
#' @return text converted to R, printed to screen or replacing input file
|
|
#' @author Waldir Leoncio
|
|
#' @export
|
|
matlab2r <- function(filename, saveOutput = FALSE) {
|
|
# Verification
|
|
if (!file.exists(filename)) stop("File not found")
|
|
# Reading file into R
|
|
txt <- readLines(filename)
|
|
# Replacing text
|
|
txt <- gsub(
|
|
pattern = "function (.+)\\s+=\\s*(.+)\\((.+)\\)",
|
|
replacement = "\\2 <- function(\\3) { return(\\1)",
|
|
x = txt
|
|
)
|
|
# txt <- gsub("\\%\\s*(\\w+)", "# \\1", txt)
|
|
txt <- gsub(";", "", txt)
|
|
txt <- gsub("for (.+)=(.+)", "for (\\1 in \\2) {", txt)
|
|
txt <- gsub("end", "}", txt)
|
|
txt <- gsub("(.),(\\S)", "\\1, \\2", txt)
|
|
# TODO: replace forms like (:,:) with [, ]
|
|
# TODO: add argument to skip some of these rules
|
|
txt <- gsub("if (.+)", "if (\\1) {", txt) # FIXME: paste comments after {
|
|
txt <- gsub("else$", "} else {", txt)
|
|
txt <- gsub("elseif", "} else if", txt)
|
|
txt <- gsub("\\(~", "(!", txt)
|
|
txt <- gsub("while (.+)", "while \\1 {", txt)
|
|
## Math operators
|
|
txt <- gsub("(\\S)\\+(\\S)", "\\1 + \\2", txt)
|
|
txt <- gsub("(\\S)\\-(\\S)", "\\1 - \\2", txt)
|
|
txt <- gsub("(\\S)\\*(\\S)", "\\1 * \\2", txt)
|
|
# Returning converted code
|
|
if (!saveOutput) {
|
|
return(cat(txt, sep="\n"))
|
|
} else {
|
|
return(
|
|
write.table(
|
|
x = txt,
|
|
file = filename,
|
|
quote = FALSE,
|
|
row.names = FALSE,
|
|
col.names = FALSE
|
|
)
|
|
)
|
|
}
|
|
}
|