【问题标题】:Index named variables in functions在函数中索引命名变量
【发布时间】:2021-01-22 17:13:54
【问题描述】:

这可能是一个微不足道的问题,但我正在努力解决它。 我正在尝试在函数中索引命名变量。举个例子。我想为我的变量分配标签。我知道我可以使用以下代码行来做到这一点

iris<–iris
attr(iris$Sepal.Width, "label") <- "Label 1"
library(Hmisc)
contents(iris)
              Labels Levels Storage
Sepal.Length                 double
Sepal.Width  Label 1         double # my variable is labelled
Petal.Length                 double
Petal.Width                  double
Species                   3 integer

但是,如果我尝试创建一个执行相同操作的函数,我会遇到错误,因为我无法在用户编写的函数中索引命名变量。 例如,如果我创建一个这样定义的函数labvar,我会遇到错误。

labvar <- function(var,lab){
attr(iris[[var]], "label") <- lab
}
labvar("Sepal.Length", "label 2")
             Labels Levels Storage
Sepal.Length                 double # variable remains not labelled
Sepal.Width  Label 1         double
Petal.Length                 double
Petal.Width                  double
Species                   3 integer
 

我还绑定了多种替代方法来使用iris[[var]],iris[var],iris{{var}} 对变量进行索引,但这些方法都不起作用。 谁能帮助我并解释如何像在函数外使用 $ 那样索引命名变量?

非常感谢您的帮助

【问题讨论】:

  • 你到底想在这里做什么?如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。你can't use $ with a variable 但你可以使用[[]] 但看起来这并不是问题所在。什么对你“不起作用”?你有错误吗?
  • 我已经编辑了这个问题,我希望它更清楚。不幸的是[[]] 不起作用
  • 您需要更清楚“不起作用”的含义。运行代码时会发生什么或不会发生什么。运行函数后的期望值是多少?似乎您以错误的方式分配值。你的意思是attr(dt[[var]], "label") &lt;- lab?他们确保使用引号labvar("Sepal.Length", "label 1") 调用该函数。但是您在函数中使用了dt,并且没有在任何奇怪的地方定义。

标签: r function indexing


【解决方案1】:

这里有很多语法/功能问题。

  • [[ 与字符向量一起使用,因此主体为 attr(iris[[var]], "label") 的函数将期望 var = "Speal.Length" 作为参数,而不是 var = Sepal.Length
  • 您在函数内使用-&gt; 是错误的-您希望将标签分配给属性,而不是将属性分配给标签
  • 您的函数可能应该将整个数据框作为输入,
  • 并按原样返回修改后的数据帧,
  • 同样您需要分配结果

解决这些问题:

lab_var = function(data, var, lab) {
  attr(data[[var]], "label") = lab
  return(data)
}

labeled_iris = lab_var(iris, "Sepal.Length", "my_label")
attr(labeled_iris$Sepal.Length, "label")
# [1] "my_label"

【讨论】:

  • 亲爱的@GregorThomas,非常感谢您的解释,但我担心解决方案仍然不起作用。我在数据上尝试了lab_var 函数,但不幸的是该变量仍未标记。我还编辑了这个问题,它可能有助于澄清几点(感谢您发现错别字)
  • 另外,如果可以在不使用"" 的情况下对变量进行索引,那将是理想的。但我不确定它会如何工作
  • 我不知道你所说的“不起作用”是什么意思——我展示了一个可重现的例子,它确实起作用了,我演示了将"my_label" 排除在外。您需要更加具体。
  • 非常感谢,它运行良好,非常清晰!只是几个问题 1)您使用= 而不是&lt;- 来分配功能是否有特定原因?另外,有没有一种无需使用"" 就可以进行索引的方法?提前非常感谢
  • 我只是更喜欢= 而不是&lt;- - 它让我在 R 社区中成为一个怪人。如果您愿意,请切换到&lt;-。至于跳过引号,您可以使用substitute() - 查看一些示例in this FAQ
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2017-11-14
  • 1970-01-01
  • 2018-07-11
  • 2015-02-03
相关资源
最近更新 更多