&引用;对象'';当引用对象是R中的嵌套函数时找不到

&引用;对象'';当引用对象是R中的嵌套函数时找不到,r,function,dataframe,R,Function,Dataframe,尝试将函数嵌套在函数中,以在接收数据帧后返回R中的列表。但是马上就遇到了问题得到了错误: ------frqTbl中的错误 有没有办法定义一个变量,在 函数定义 否。(请参阅第一个代码块) 还是嵌套不正确 其实不是。你把变量名搞乱了(参见第二个代码块) 我建议使用以下代码来涵盖您的示例: frqTbl <- function(df){ fctvr <- df[sapply(df,is.factor)] logicvr <- df[sapply(df,is.logica

尝试将函数嵌套在函数中,以在接收数据帧后返回R中的列表。但是马上就遇到了问题得到了错误:

------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.")  
  }
}

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)

frqTbl好的-我建议您首先分离不同的函数。frqTbl()和rSqd()的定义应该在mstrFnct()之外。在mstrFnct()中,应该只调用另外两个。然后请修复变量名。R是一种区分大小写的语言。你可能指的是
diamonds[1:100,]
,而不是
diamonds[1-100,]
。是不是我原来的代码中的变量被搞乱了,在修复之后,你的第二块代码开始工作了?我试图添加在mstrFnct之外工作的其他嵌套函数,但添加它们时,它只是将输出返回到summ()。我在上一个问题中解决了这个问题:我没有意识到return()只会返回它的第一个实例。无论如何,谢谢你的回答和批评我最初错误的评论。
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)