2016-10-23 12 views
-2

データフレームを取り込んだ後にRでリストを返す関数で関数をネストしようとしています。エラー:"参照オブジェクトがネストされた関数であるときにオブジェクト '...'が見つかりません

Error in ------frqTbl <- function(df) { : object 'frqTbl' not found

は、関数定義の前に関数の変数を定義するためにいくつかの方法はありますか入れ子に間違っている

はでテスト:??

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) 
} 
+0

[OK]をクリックします。まず、別の機能を分けてください。 frqTbl()とrSqd()の定義はmstrFnct()の外側になければなりません。 mstrFnct()では、他の2つを呼び出すだけです。その後、変数名を修正してください。 Rは大文字と小文字を区別する言語です。 – nevrome

+0

おそらく、あなたは 'diamonds [1:100、]'を意味し、 'diamonds [1-100、]'は意味しません。 – nevrome

答えて

1

Is there some way to define a variable that's a function before the function definition?

(最初のコードチャンクを参照)は、実際に

Or is the nesting incorrect?

ありません。あなたはちょうど変数名を台無しにしました。 (第2のコードチャンクを参照してください)

私はあなたの例をカバーするために、次のコードをお勧め:

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) 
+0

本当に私の元のコードでは、修正した後、あなたのコードの2番目のチャンクを動作させる混乱していた変数だけでしたか?私はmstrFnctの外で動作するネストされた関数を追加しようとしていますが、それらを追加すると出力がsumm()に返されます。例: – xq1515426

+0

私は最後の問題でこの問題を解決しました。私はreturn()が最初のインスタンスを返すだけであることに気付きませんでした。いずれにせよ、あなたの答えと私の初期の誤りを批評するコメントに感謝します。 – xq1515426