为什么我的表名出现了?

dje*_*lin 0 attributes r function

我在R中运行了这个:

a <- factor(c("A","A","B","A","B","B","C","A","C"))
Run Code Online (Sandbox Code Playgroud)

然后我做了一张桌子

results <- table(a)
Run Code Online (Sandbox Code Playgroud)

但是当我跑

> attributes(results)
$dim
[1] 3

$dimnames
$dimnames$a
Run Code Online (Sandbox Code Playgroud)

但我很困惑为什么会a出现在我的属性中?我以前用Java编程,我认为变量名不应该出现在你的函数中.

MrF*_*ick 6

R函数不仅可以查看传递给它们的数据,还可以看到为调用它们而运行的实际调用.因此,当您运行时,table(a)table()函数不仅会看到值a,而且还可以看到这些值来自名为的变量a.

因此,默认情况下,table()喜欢在结果表中命名每个维度.如果未通过dnn=参数在调用中传递显式名称,table()则将回溯调用,并将变量名称转换为字符,并将该值用于维度名称.

因此,在table()运行之后,它与变量没有直接连接a,它只是使用该变量的名称作为结果的字符标签.

R中的许多功能都是这样做的.例如,这类似于如何plot(height~weight, data=data.frame(height=runif(10), weight=runif(10)))知道在图上使用轴标签的名称"weight"和"height".

这是一个简单的例子,展示了一种可以实现的方法.

paramnames <- function(...) {
    as.character(substitute(...()))
}
paramnames(a,b,x)
# [1] "a" "b" "x"
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

我认为唯一的答案是因为设计师希望这样.使用形成边距的变量名称标记表对象似乎是合理的:

> b <- c(1,1,1,2,2,2, 3,3,3)
> table(a, b)
   b
a   1 2 3
  A 2 1 1
  B 1 2 0
  C 0 0 2
Run Code Online (Sandbox Code Playgroud)

R旨在作为S的克隆,S旨在作为工作统计学家的工具.R还有一个方便的函数来处理表对象,as.data.frame:

> as.data.frame(results)
  a Freq
1 A    4
2 B    3
3 C    2
Run Code Online (Sandbox Code Playgroud)

如果你想建立执行同一类标签的功能或以其他方式获取传递给函数的对象的名称再有就是deparse(substitute(.))-maneuver:

 myfunc <- function(x) { nam <- deparse(substitute(x)); print(nam)}

>  myfunc <- function(x) { nam <- deparse(substitute(x)); print(nam)}
> myfunc(z)
[1] "z"
> str(z)
Error in str(z) : object 'z' not found
Run Code Online (Sandbox Code Playgroud)

所以"z"甚至不需要存在.如果你问我,高度"不规则".如果你"询问" myfunc它的参数列表是什么样的,你会得到预期的答案:

> formals(myfunc)
$x
Run Code Online (Sandbox Code Playgroud)

但这是一个列表,其单个元素具有R名称x.R名称是语言元素,而names函数将其检索为字符值"x",它不是语言元素:

> names(formals(myfunc))
[1] "x"
Run Code Online (Sandbox Code Playgroud)

R有Lisp的一些方面(解释,功能(通常))虽然它的语言函数和数据对象之间的分界线对我来说似乎不那么容易,但我对Lisp并不是特别精通.