2013-06-01 4 views
2

Я хотел бы использовать строку в качестве аргумента функции, чтобы использовать эту строку для построения результата, но в R вызывается имя переменной аргумента вместо его строкового значения. Я пробовал разные решения (diparse, as.character ...), но до сих пор нет решения. Есть ли у вас какие-либо идеи?Передача строки как аргумент функции

mcnemar_test <- function (c1,c2,class1, class2) 
{ 
    name1=label(class1) 
    name2=deparse(substitute(class2)) 

    v1 = c1$encerts 
    v2 = c2$encerts 

    e00 = sum(ifelse(v1+v2==0,1,0)) #bad classification for both 
    e01 = sum(ifelse(v1<v2,1,0)) #bad classification for 1 
    e10 = sum(ifelse(v1>v2,1,0)) #bad classification for 2 
    e11 = sum(ifelse(v1+v2==2,1,0)) #good classification for both 

    matriu <- matrix(c(e00,e01,e10,e11),nrow = 2, 
     dimnames = list(name1 = c("Disapprove", "Approve"), 
         name2 = c("Disapprove", "Approve"))) 
    print (matriu) 
    t <- mcnemar.test(matriu) 
    return (t) 
} 
mcnemar_test(classifiers.NaiveBayes,classifiers.CART,"aa","bb") 

Я хотел бы видеть «аа» и «ВВ», но увидеть «name1 и name2

+0

Вы пробовали 'eval'? Много вопросов и ответов здесь на такого рода вещах – Ben

+0

@Ben eval - всего одна буква от R inferno; Лучше всего избегать, когда это действительно не нужно – baptiste

+0

Совершенно верно, существуют менее неясные методы, это [медленно] (https://stat.ethz.ch/pipermail/r-help/2007-January/123208.html), что указывает на [Недостаток знаний] (http://stackoverflow.com/q/13649979/1036500) и существует много [альтернатив] (http://www.talkstats.com/showthread.php/20974-Why-is-eval- parse-bad? p = 67452 & viewfull = 1 # post67452), например [get] (http://stackoverflow.com/questions/13647046/avoiding-the-infamous-evalparse-construct) и ['[['] (http://stackoverflow.com/a/11025440/1036500). Какое одно письмо прочь, о котором вы говорите (я не знаком с этим текстом ...) – Ben

ответ

2

R считает, что вы хотите, чтобы имена„NAME1“и„NAME2“, так же, как если бы я был чтобы создать список с именами «а» и «б»:

my.list <- list(a=1, b=2) 

Попробуйте с помощью structure и передавая имена как вектор символов:

matriu <- matrix(c(e00,e01,e10,e11),nrow = 2, 
       dimnames = structure(list(c("Disapprove", "Approve"), 
              c("Disapprove", "Approve")), 
             names=c(class1, class2))) 

Или установка имена элементов после создания списка:

matriu <- matrix(c(e00,e01,e10,e11),nrow = 2, 
       dimnames = list(c("Disapprove", "Approve"), 
           c("Disapprove", "Approve"))) 
names(dimnames(matriu)) <- c(class1, class2) 
-1

Edit: (.) ​​В коде функции падения ярлыка и deparse (. Замещающая()) попытка и использовать это:

dimnames = setNames(list( c("Disapprove", "Approve"), 
          c("Disapprove", "Approve")), 
        c(class1, class2)) 
Смежные вопросы