【问题标题】:define $ right parameter with a variable in R [duplicate]用R中的变量定义$ right参数[重复]
【发布时间】:2011-03-05 23:57:04
【问题描述】:

我想将一个变量传递给二元运算符 $。

假设我有这个

> levels(diamonds$cut)
[1] "Fair"      "Good"      "Very Good" "Premium"   "Ideal" 

然后我想创建一个函数,将 $ 的选择器作为参数

my_helper <- function (my_param) {
  levels(diamonds$my_param)
}

但这不起作用

> my_helper(cut)
NULL

> my_helper("cut")
NULL

【问题讨论】:

    标签: r


    【解决方案1】:

    使用[[ 代替$x$yx[["y"]] 的简写。

    my_helper <- function (my_param) {
      levels(diamond[[my_param]])
    }
    my_helper("cut")
    

    【讨论】:

      【解决方案2】:

      如果不能访问对象本身,就无法访​​问对象的组件,这就是 my_helper() 失败的原因。

      您似乎对 R 对象有点困惑,我强烈推荐一本像样的介绍性文本。 CRAN 网站上有一些不错的免费书籍,还有几本不错的书籍。 SO在这方面有很多线程,例如

      【讨论】:

      • 为什么说他无权访问该对象?我假设diamonds 在全局范围内,问题是$ 不接受字符串。
      • 这在技术上是正确的,但却是错误的——不要假设全局可见性,而是让你的访问器函数显式。整个方法是错误的,因此需要进行更彻底的阅读。如果必须,mylevels &lt;- function(x,y) levels(x[,y]) 应该可以工作 --- 但是还有更多关于列表、data.frames 等的知识,以及何时使用什么。加上需要测试名字是否存在,对象是否合适等pp
      • 我在某种程度上不同意 - 在某些情况下,在交互式数据分析(非编程)期间,定义依赖于固定数据集名称的小型辅助函数可能很有用。
      • Dirk,我想我对操作符比对象更困惑。 $ 只接受字符串但没有引号,所以我不能 x$myvar 因为它隐式地将 myvar 转换为“myvar”。另一方面,可以使用与 x[[myvar]] 配合良好的 x[["y"]]。无论如何,非常感谢您的帮助!
      【解决方案3】:

      试试这样的:

      dat = data.frame(one=rep(1,10), two=rep(2,10), three=rep(3,10))
      myvar="one"
      dat[,names(dat)==myvar]
      

      这应该返回数据框 dat 的第一列/变量

      dat$one --> [1] 1 1 1 1 1 1 1 1 1 1
      

      【讨论】:

      • 你不需要names(dat)==myvar,只需传入`myvar'即可。
      • 当然你是对的 - 我更喜欢多余的例子来展示真正发生的事情;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多