«Объект ‘…’ не найден, когда объект, на который ссылается, является вложенной функцией в R

#r #function #dataframe

#r #функция #фрейм данных

Вопрос:

Попытка вложить функции с помощью функции In, чтобы вернуть список в R после получения фрейма данных. Но сразу столкнулся с проблемой, получив ошибку:

Ошибка в ——frqTbl <- function(df) { : объект ‘frqTbl’ не найден

Есть ли какой-либо способ определить переменную, которая является функцией, до определения функции? Или вложение неверное?

Проверено с:

 data(diamonds, package = "ggplot2")
test <- diamonds[1:100,]
mstrFnct(test)

mstrFnct <- function(df){      
    output <- list()  
    frqTbl <- function(df){
        fctvr <- df[sapply(df,is.factor)]
        logicvr <- df[sapply(df,is.logical)] 
        nwDf <- data.frame(fctvr,logicvr)
        if(ncol(nwDf)>0){      
            freq <-list() 
            for (i in 1:ncol(nwDf)){ 
               freq[[i]] <- as.data.frame(table((nwDf)[,i]))
               names(freq[[i]])[1]=colnames(nwDf[i])
            } 
            return(freq)
        }
        else{
            print("There are no categorical or logical variables in the data   
            frame.")  
        }
    }
    output[[length(output) 1]] <- frqTbl(df)
    rSqd <- function(df){
        y <- df[sapply(df,is.numeric)]         
        if(ncol(y)>=2){ 
            c <- combn(colnames(y), 2) 
            vrPrs <- paste(c[1,], c[2,], sep = "-")
            m <- cor(y, method = "pearson")
            r <- m[which(lower.tri(m))] 
            vlus <- r^2
            df2 <- data.frame(vrPrs, values)
            names(df2) <- sub("^VrPrs$", "Variable Pairs", 
                names(df2)) 
            names(df2) <- sub("^vlus$", "R-Square", names(df2))
            format.data.frame(df2) 
            return(df2)
        }
        else{
            print(paste("This Data Frame does not have two or more numerical  
            columns to compute the Pearson correlation coefficient(s)."))
        }
    }
    output[[length(output) 1]] <- rSqd(df)
}
  

Комментарии:

1. Хорошо — я предлагаю вам прежде всего разделить разные функции. Определение frqTbl() и rSqd() должно выходить за пределы mstrFnct(). В mstrFnct() должны быть просто вызваны две другие. Тогда, пожалуйста, исправьте имена ваших переменных. R — язык, чувствительный к регистру.

2. И, вероятно, вы имеете в виду diamonds[1:100,] и не diamonds[1-100,] .

Ответ №1:

Есть ли какой-нибудь способ определить переменную, которая является функцией, перед определением функции?

(см. Первый фрагмент кода)

Или вложение неверное?

На самом деле нет. Вы просто перепутали имена переменных. (смотрите Второй фрагмент кода)

Я предлагаю следующий код для описания вашего примера:

 frqTbl <- function(df){

  fctvr <- df[sapply(df,is.factor)]
  logicvr <- df[sapply(df,is.logical)] 
  nwDf <- data.frame(fctvr,logicvr)

  if(ncol(nwDf)>0){ 

    freq <-list() 
    for (i in 1:ncol(nwDf)){ 

      freq[[i]] <- as.data.frame(table((nwDf)[,i]))
      names(freq[[i]])[1]=colnames(nwDf[i])
    } 
    return(freq)
  }
  else{
    print("There are no categorical or logical variables in the data   
            frame.")  
  }
}

rSqd <- function(df){

  y <- df[sapply(df,is.numeric)] 

  if(ncol(y)>=2){ 

    c <- combn(colnames(y), 2) 

    vrPrs <- paste(c[1,], c[2,], sep = "-")

    m <- cor(y, method = "pearson")

    r <- m[which(lower.tri(m))] 

    vlus <- r^2

    df2 <- data.frame(vrPrs, vlus)

    names(df2) <- sub("^vrPrs$", "Variable Pairs", 
                      names(df2)) 
    names(df2) <- sub("^vlus$", "R-Square", names(df2))


    format.data.frame(df2) 
    return(df2)

  }
  else{
    print(paste("This Data Frame does not have two or more numerical  
            columns to compute the Pearson correlation coefficient(s)."))
  }
}

mstrFnct <- function(df){

  output <- list()
  output[[length(output) 1]] <- frqTbl(df)
  output[[length(output) 1]] <- rSqd(df)

  return(output)
}

data(diamonds, package = "ggplot2")
test <- diamonds[1:100,]
mstrFnct(test)
  

Но вы также могли бы упаковать определения функций в главную функцию. Вот так:

 mstrFnct <- function(df){

  # create output list
  output <- list()

  # define function frqTbl()
  frqTbl <- function(df){

    fctvr <- df[sapply(df,is.factor)]
    logicvr <- df[sapply(df,is.logical)] 
    nwDf <- data.frame(fctvr,logicvr)

    if(ncol(nwDf)>0){ 

      freq <-list() 
      for (i in 1:ncol(nwDf)){ 

        freq[[i]] <- as.data.frame(table((nwDf)[,i]))
        names(freq[[i]])[1]=colnames(nwDf[i])
      } 
      return(freq)
    }
    else{
      print("There are no categorical or logical variables in the data   
          frame.")  
    }
  }

  # call function frqTbl() and store result in list
  output[[length(output) 1]] <- frqTbl(df)

  # define function rSqd()
  rSqd <- function(df){

    y <- df[sapply(df,is.numeric)] 

    if(ncol(y)>=2){ 

      c <- combn(colnames(y), 2) 

      vrPrs <- paste(c[1,], c[2,], sep = "-")

      m <- cor(y, method = "pearson")

      r <- m[which(lower.tri(m))] 

      vlus <- r^2

      df2 <- data.frame(vrPrs, vlus)

      names(df2) <- sub("^vrPrs$", "Variable Pairs", 
                        names(df2)) 
      names(df2) <- sub("^vlus$", "R-Square", names(df2))


      format.data.frame(df2) 
      return(df2)

    }
    else{
      print(paste("This Data Frame does not have two or more numerical  
            columns to compute the Pearson correlation coefficient(s)."))
    }
  }

  # call function rSqd() and store result in list
  output[[length(output) 1]] <- rSqd(df)

  return(output)
}

data(diamonds, package = "ggplot2")
test <- diamonds[1:100,]
mstrFnct(test)
  

Комментарии:

1. Действительно ли в моем исходном коде были перепутаны только переменные, после исправления которых вы запустили свой второй фрагмент кода? Я пытаюсь добавить дополнительные вложенные функции, которые работают вне mstrFnct, но когда я добавляю их, это просто возвращает выходные данные до summ(). например:

2. Я решил проблему в моей последней задаче: я не понимал, что return () возвращает только первый его экземпляр. Как бы то ни было, спасибо вам за ваш ответ и комментарии с критикой моих первоначальных ошибок.