2016-05-16 19 views
12

'daki standart değerlendirmeyi anlama lazyeval::interp kullanarak Non-standard evaluation vignette'da önerildiği gibi sabitleri ve aktarılan değişken adlarını karıştırmaya çalışıyorum. Ben karakter vektör ("(Weird) Variable name") tembel değerlendirmenin sonucunu atamış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) 

Not: Burada

ne istiyorum yaptığı bir örnektir. Ancak, tembel değerlendirme sonucunu "var_name" adlı bir hazırlığa atanan 'a atadığımda. Birisi bu davranışı anlamaya yardımcı olabilir mi?

# 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) 

İki işlevde aynı sonuçlar bulunmuyor mu? Doğrudan herhangi R fonksiyonunu çağırırken

cevap

18

, parametre adlarının (ve parametre adlarıyla bir işlev çağrısında = simgenin solundaki bu şeyleri ortalama) için değişkenler kullanamazsınız. Parametre adları her zaman gerçek değerler olarak alınır. Bu iki aynı

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

veya çalışmak için ilk bir değişken olmak zorunda değildir

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 bakmak ve böyle bir değişken var olsa bile, bu göz ardı edilir. Alıntılar ayrıştırma sırasında temelde atılır - bu gerçekten bir karakter değeri değil, bir sembol.

Değişken adları dinamik olarak ayarlamanız gerekiyorsa, parametrelerinizi bir liste olarak oluşturmanız ve bu listenin adlarını ayarlamanız gerekir.

sen sonra mutate_ fonksiyonun .dots= parametresine geçirebilmesi parametre adları ayarlamak için setNames kullanabileceğiniz bir karakter değeri olarak parametrenin adını geçirmek için gidiyoruz. bunların hepsi eşdeğer

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")) 
çünkü Örneğin

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) 

budur