vector族函数


vector(mode = "logical", length = 0)
as.vector(x, mode = "any")  #下面没写明默认值,所以Usage这里写的就算默认值
is.vector(x, mode = "any")
这三个函数都是同族的
vector produces a vector of the given length and mode.
vector()产生一个指定模式和长度的向量 

as.vector, a generic(泛型), attempts to coerce its argument into a vector of mode mode (the default is to coerce to whichever vector mode is most convenient): if the result is atomic all attributes are removed(结果是原生类型,则所有的属性将被移除).
as.vector()转化为一个指定模式的向量 

is.vector returns TRUE if x is a vector of the specified mode having no attributes other than names. It returns FALSE otherwise.
如果x是一种只含有names属性的特定模式类型的向量,则返回T(所以判断的时候要加上类型啊~(mode = "any")
判断是否为指定模式的向量(默认的模式是“any”)

Arguments
mode   
character string naming an atomic mode(应指数值,字符,逻辑等类型 下面detail有解释) or "list" or "expression" or (except for vector) "any".
length   
a non-negative integer specifying the desired length. For a long vector, i.e., length > .Machine$integer.max, it has to be of type "double". Supplying an argument of length other than one is an error.
x   
an R object.

Details
The atomic modes are "logical", "integer", "numeric" (synonym(同义词) "double"), "complex", "character" and "raw".
 
If mode = "any", is.vector may return TRUE for the atomic modes, list and expression. For any mode, it will return FALSE if x has any attributes except names. (This is incompatible with S.) On the other hand, as.vector removes all attributes including names for results of atomic mode (but not those of mode "list" nor "expression").
如果mode是any,则is.vector将会对原生模式,列表,表达式都返回T,只要含有除了names属性外的其他属性就返回F。
as.vector()将去除原生类型中的所有属性(包括names),但list和expression不会
 
Note that factors are not vectors; is.vector returns FALSE and as.vector converts a factor to a character vector for mode = "any".
因子并不是向量,as.vector将其转化为字符向量
 
Value
For vector, a vector of the given length and mode. Logical vector elements are initialized to FALSE, numeric vector elements to 0, character vector elements to "", raw vector elements to nul bytes and list/expression elements to NULL.
对于给定长度和模式的向量。
逻辑向量用F初始化其元素,数值向量用0初始化其元素。
字符向量用""初始化其元素,list/expression用NULL初始化其元素

For is.vector, TRUE or FALSE. is.vector(x, mode = "numeric") can be true for vectors of types "integer" or "double" whereas is.vector(x, mode = "double") can only be true for those of type "double".
使用is.vector的时候,最好指定mode(默认是nay),以便于更准确的判断

Methods for as.vector()
Writers of methods for as.vector need to take care to follow the conventions of the default method. In particular
Argument mode can be "any", any of the atomic modes, "list", "expression", "symbol", "pairlist" or one of the aliases(别名) "double" and "name".
The return value should be of the appropriate mode. For mode = "any" this means an atomic vector or list.
Attributes should be treated appropriately: in particular when the result is an atomic vector there should be no attributes, not even names.
is.vector(as.vector(x, m), m) should be true for any mode m, including the default "any".
 
Note
as.vector and is.vector are quite distinct from the meaning of the formal class "vector" in the methods package, and hence as(x, "vector") and is(x, "vector").
Note that as.vector(x) is not necessarily a null operation if is.vector(x) is true: any names will be removed from an atomic vector.
如果is.vector(x)的结果是T,as.vector(x)不一定是一个空操作(因为我虽然还是向量,但可以祛除names属性呀,所以我还是操作的),这里的x是同一个x

例子1
  1. df <- data.frame(x = 1:3, y = 5:7)
  1. try(as.vector(data.frame(x = 1:3, y = 5:7), mode = "numeric"))
  2. Error in as.vector(data.frame(x = 1:3, y = 5:7), mode = "numeric") :
  3.   (list) object cannot be coerced to type 'double'
因为数据框是列表的一种,列表不能转化为mode="numeric"?
试验
  1. > as.vector(data.frame(x = 1:3, y = 5:7), mode = "list")
  2.   x y
  3. 1 1 5
  4. 2 2 6
  5. 3 3 7
  6. > class(as.vector(data.frame(x = 1:3, y = 5:7), mode = "list"))
  7. [1] "data.frame"
  8. > mode(as.vector(data.frame(x = 1:3, y = 5:7), mode = "list"))
  9. [1] "list"
我自己再试了下
  1. > test<-list(c(1,2),c(2,3))
  2. > as.vector(test,mode="numeric")
  3. Error in as.vector(test, mode = "numeric") : 
  4.   (list) object cannot be coerced to type 'double'
得出结论,as.vector真是鸡肋
//2016年3月18日22:32:15
然而,你并不能这么说它鸡肋,他是可以成功将矩阵转为向量的,只是不能对数据框罢了,因为数据本就是存不同类型的数据的,你并不能强求人家转,而且这也没什么意义。
于是引出下一个问题:


例子2
  1. > x <- c(a = 1, b = 2)
  2. > is.vector(x)
  3. [1] TRUE
  4. > as.vector(x)
  5. [1] 1 2

  6. > all.equal(x, as.vector(x)) ## FALSE

  7. [1] "names for target but not for current"

  8. > attributes(x)
  9. $names
  10. [1] "a" "b"
  11.  
  12. > attributes(as.vector(x))
  13. NULL
主要为了说明as.vector()会祛除names属性

例子3
  1. > is.list(df)
  2. [1] TRUE
  3. > ! is.vector(df)
  4. [1] TRUE

  5. > is.vector(df, mode = "list")
  6. [1] FALSE

  7. > ! is.vector(df, mode = "list")
  8. [1] TRUE

  9. > is.vector(list(), mode = "list")
  10. [1] TRUE









posted @ 2016-03-20 13:41  旅鼠  阅读(984)  评论(0编辑  收藏  举报