2017-05-28 5 views
1

少し異なる関数を作成したいと思いますが、それぞれがグローバル変数を受け入れることができます。assignを使用して関数内に複数の関数を作成するR

this_valueには、this_keyという名前の関数を割り当てるためにassignを使用します。作成する必要がある3つの機能は、func_a,func_b、およびfunc_cです。

新たに作成された各関数は、入力をxとし、その関数に特有の何かをxにする必要があります。この場合、「key_name:name ----- value_x:x」と印刷します。したがって、nameは、機能がfunc_a,func_b、またはfunc_cのいずれであるかによって異なります。たとえば、func_aを呼び出すと、「key_name:a」と表示されます。

to_name <- c("a", "b", "c") 

create_funcs <- function() { 
    all_funcs <- list() 

    for (name in to_name) { 
    this_key <- paste0("func_", name) 

    this_value <<- function(x) { 
     paste0("key_name: ", name, " ----- value_x: ", x) 
    } 
    assign(this_key, this_value, envir = .GlobalEnv) 

    all_funcs <- c(all_funcs, this_key) 
    } 
    return(all_funcs) 
} 

create_funcs() 

ただし、関数を作成した後、それらは、それぞれベクターのみto_nameに「C」、または最後の値のnameを返します。

func_a("foo") # key_name: c ----- value_x: foo 
func_b("bar") # key_name: c ----- value_x: bar 

代わりに、func_a("foo")は ":A ----- value_x:FOOたキー名" を返す必要があります。何が価値があるために

、これは同様のオブジェクトに割り当てる機能で動作します。

create_objects <- function() { 
    all_objs <- list() 

    for (name in to_name) { 
    this_key <- paste0("key_", name) 

    this_value <- paste0("value_", name) 

    assign(this_key, this_value, envir = .GlobalEnv) 

    all_objs <- c(all_objs, this_key) 
    } 
    return(all_objs) 
} 

create_objects() 

例:外観を取るための

key_a # value_a 

ありがとう!

答えて

1

実際のユースケースはおそらくこの再現可能な例よりも複雑なので、これで問題が解決するかどうかはわかりません。しかし、あなたはpurrr::partialをチェックしたいかもしれません。

ここに私がその機能を使用して考え出した解決策があります。

library(purrr) 

func_ <- function(x, key_name) { 
    paste0("key_name: ", key_name, " ----- value_x: ", x) 
} 


func_a <- partial(func_, key_name = "a") 

func_a("foo") 

#> [1] "key_name: a ----- value_x: foo" 


assign("func_b", partial(func_, key_name = "b")) 

func_b("foo") 

#> [1] "key_name: b ----- value_x: foo" 

編集:ここでは

あなただけのそれぞれのための新しい関数を作成するpurrr::walkを使用して(forループと同じように)取ると文字ベクトルと各要素を反復処理することができます。 assign()コールでは、環境を.GlobalEnvに設定してください。このようなことについては環境のスコープに関することはあまりよく分かりませんが、これは時には悪い考えかもしれないことを読んでいるように感じますが、あなたが説明したことをするようです。お役に立てれば。

letters %>% walk(~ assign(x = paste0("func_", .x), 
          value = partial(func_, key_name = .x), 
          envir = .GlobalEnv)) 

func_x("foo") 

#> [1] "key_name: x ----- value_x: foo" 
+0

私は依然としてforループ内で代入を行いたいので、関数の外にそれぞれの関数の名前を付ける必要はありません。この 'all_funcs < - c(all_funcs、partial(func_、name = name、envir = .GlobalEnv))'のようなものは、上記と同じ結果を返します( 'func_a(" foo ")#key_name:c---- - value_x:foo') – amanda

+0

@amandaこのような複数の関数をループで作成する例を追加する答えを編集しました。役に立つと助かります – austensen

+0

完璧、おかげでトン。私が "ぷるる"列車に乗るほうがいいと思うよ! – amanda

関連する問題