2016-05-16 8 views
12

lazyeval::interpを使用してNon-standard evaluation vignetteで提案されているように、定数と引用された変数名を組み合わせようとしています。私は文字ベクトル("(Weird) Variable name")に遅延評価の結果を割り当てたR:mutate_の標準評価を理解する

# create sample dataset 
df_foo = data_frame(
    `(Weird) Variable name` = 100, 
    group_var = sample(c("Yes", "No"), size = 100, replace = TRUE) 
) 

# function to update the value of weirdly named variable 
update_var_1 = function(var_name) { 
    df_foo %>% 
    mutate_(
     "(Weird) Variable name" = 
     interp(quote(ifelse(group_var_val == "Yes", var_name_val/10, var_name_val/20)), 
       group_var_val = as.name("group_var"), 
       var_name_val = as.name(var_name)) 
    ) 
} 

# test the function 
update_var_1("(Weird) Variable name") %>% 
    head(n = 20) 

注:ここでは

は、私が何をしたいん例です。しかし、遅延評価の結果を"var_name"というリテラルに割り当てられるvar_nameに割り当てると、誰かがこの行動を理解するのを助けることができる?

# function to update the value of weirdly named variable 
update_var_2 = function(var_name) { 
    df_foo %>% 
    mutate_(
     var_name = 
     interp(quote(ifelse(group_var_val == "Yes", var_name_val/10, var_name_val/20)), 
       group_var_val = as.name("group_var"), 
       var_name_val = as.name(var_name)) 
    ) 
} 

# test the function 
update_var_2("(Weird) Variable name") %>% 
    head(n = 20) 

2つの機能に同じ結果がありませんか?

答えて

18

任意のR関数を直接呼び出すときは、パラメータ名に変数を使用することはできません(パラメータ名では、関数呼び出しの=シンボルの左側にあるものを意味します)。パラメータ名は常にリテラル値とみなされます。これら二つは同じ

f(a=3) 
f("a"=3) 

あるか、仕事が最初のための変数である必要はありません

deparse(quote(f(a=3))) 
# [1] "f(a = 3)" 
deparse(quote(f("a"=3))) 
# [1] "f(a = 3)" 
a <- "b" 
deparse(quote(f(a=3))) 
# [1] "f(a = 3)" 

aを見て、そして、そのような変数が存在する場合でも、それは無視されます。引用符は、基本的には解析時にスローされます。実際には文字値ではなく、シンボルです。

変数名を動的に設定する必要がある場合は、パラメータをリストとして作成し、そのリストの名前を設定する必要があります。

パラメータの名前を文字値として渡す場合は、setNamesを使用してそのパラメータ名を設定し、パラメータのmutate_関数に渡すことができます。これらはすべて同等

df <- data_frame(a=1:10) 
mutate(df, a=a+5) 
mutate(df, "a"=a+5) #identical to first, not really a character variable 
mutate_(df, a=quote(a+5)) 
mutate_(df, .dots=list(a=quote(a+5))) 
mutate_(df, .dots=setNames(list(quote(a+5)),"a")) 
をしているので、例えば

update_var_3 <- function(var_name) { 
    df_foo %>% 
    mutate_(.dots= 
    setNames(list(
     interp(quote(ifelse(group_var_val == "Yes", var_name_val/10, var_name_val/20)), 
       group_var_val = as.name("group_var"), 
       var_name_val = as.name(var_name) 
    )), var_name)) 
} 

update_var_3("(Weird) Variable name") %>% 
    head(n = 20) 

です

関連する問題