Применить функцию внутри другой, используя тот же список в R - PullRequest
0 голосов
/ 30 марта 2020

Мне нужна помощь, я пытаюсь запустить функцию в другой функции с тем же df, но всегда появляется сообщение об ошибке, когда я запускаю код

Ниже приведен пример моего df

X <- c("Bloc", "Mp", "xcible",  "ycible", "xO", "yO", "xN", "yN", "xE", "yE", "xS", "yS", "ID_ligne")
C <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-22")
D <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-20")
E <-c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-22")
G <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-20")
H <- c("LE-01", 24, 1.710175, -33.79383, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-004-24") 
J <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-003-22")

Ex <- rbind(C,D,E,G,H,J)
colnames(Ex) <- X
Ex <- as.data.frame(Ex)
Ex$xO <- as.numeric(as.character(Ex$xO))
Ex$xS <- as.numeric(as.character(Ex$xS))
Ex$xN <- as.numeric(as.character(Ex$xN))
Ex$xE <- as.numeric(as.character(Ex$xE))
Ex$yO <- as.numeric(as.character(Ex$yO))
Ex$yS <- as.numeric(as.character(Ex$yS))
Ex$yN <- as.numeric(as.character(Ex$yN))
Ex$yE <- as.numeric(as.character(Ex$yE))
Ex.list <- split(Ex, f = Ex$ID_ligne)

Вот следующая функция, которая находится в большем, я пытаюсь запустить

eq_affine <- function(x1, y1, x2, y2){
  pente <- (y2 - y1)/(x2 - x1)
  int <- y2 - pente*x2
  return(c(pente, int))

Большая функция, но сводится к строке, когда появляется сообщение об ошибке

 exp_lin_fun_rect <- function(xO, xS, xE, xN, 
                             yO, yS, yE, yN,
                             xcible, ycible,
                             xcompe, ycompe){

  eqSE <- eq_affin(xS, yS, xE, yE)
  eqEN <- eq_affine(xE, yE, xN, yN)
  eqNO <- eq_affine(xN, yN, xO, yO)
  eqOS <- eq_affine(xO, yO, xS, yS)
  return(data.frame(cbind(eqSE, eqEN, eqNO, eqOS)))
}

И код, который я пытался запустить:

Ex <- unlist(lapply(Ex.list, exp_lin_fun_rect))

Сообщение об ошибке всегда Error in eq_affine(xS, yS, xE, yE) : argument "yE" is missing, with no default

Нет необходимости использовать оставшуюся большую функцию, потому что ошибка возникает в первой строке кода , И я использую список, потому что у меня есть тонна данных, и мне легче работать таким образом

Спасибо за помощь

1 Ответ

2 голосов
/ 30 марта 2020

Немного исправил ваш код:

# Set up original dataframe like so: 

Ex <- setNames(data.frame(rbind(C,D,E,G,H,J), stringsAsFactors = FALSE), X)

# Clean data: 

Ex <- data.frame(lapply(Ex,
       function(x) {
         if(suppressWarnings(sum(is.na(as.numeric(x)))) == sum(is.na(x))){
           x <- as.numeric(x)
         } else{
           as.character(x)
         }
       }))

# Define function:
eq_affine <- function(x1, y1, x2, y2){
  pente <- (y2 - y1)/(x2 - x1)
  int <- y2 - pente*x2
  return(c(pente, int))
}


# Define function: 
exp_lin_fun_rect <- function(xO, xS, xE, xN, yO, yS, yE, yN, xcible, ycible,
                             xcompe, ycompe){
  eqSE <- eq_affine(xS, yS, xE, yE)
  eqEN <- eq_affine(xE, yE, xN, yN)
  eqNO <- eq_affine(xN, yN, xO, yO)
  eqOS <- eq_affine(xO, yO, xS, yS)

  return(list(eqSE = eqSE, eqEN = eqEN, eqNO = eqNO, eqOS = eqOS))

}

# Apply function: 
exp_lin_fun_rect(Ex$xO, Ex$xS, Ex$xE, Ex$xN, Ex$yO, Ex$yS, Ex$yE, Ex$yN, 
                 Ex$xcible, Ex$ycible, Ex$xcompe, Ex$ycompe)

Данные:

X <- c("Bloc", "Mp", "xcible",  "ycible", "xO", "yO", "xN", "yN", "xE", "yE", "xS", "yS", "ID_ligne")
C <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-22")
D <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-20")
E <-c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-22")
G <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-20")
H <- c("LE-01", 24, 1.710175, -33.79383, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-004-24") 
J <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-003-22")
...