【问题标题】:Passing a string as function argument将字符串作为函数参数传递
【发布时间】:2013-06-01 15:55:59
【问题描述】:

我想使用一个字符串作为函数的参数,以便使用该字符串来绘制结果,但 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")

我想查看“aa”和“bb”,但查看“name1 和 name2”

【问题讨论】:

  • 你试过eval吗?这里有很多关于这类事情的问答
  • @Ben eval 距离 R inferno 仅一个字母;最好在不需要时避免
  • 很对,没有那么晦涩的方法,就是slow,表示一个lack of knowledge,还有很多alternatives,比如get[[。你所指的那一封信是什么(我不那个熟悉那个文字......)

标签: r


【解决方案1】:

R 认为您希望名称为“name1”和“name2”,就像我要创建一个名称为“a”和“b”的列表:

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)

【讨论】:

    【解决方案2】:

    编辑:在您的函数代码中删除 label(.) 和 deparse(substitute(.)) 尝试并使用它:

    dimnames = setNames( list(  c("Disapprove", "Approve"),  
                                c("Disapprove", "Approve")), 
                         c(class1, class2) )
    

    【讨论】: