不同的R的對象類屬性,當我寫了一個簡單的C函數在R,它應採取對象類中的任何對象,並且返回與inline
使用。我曾試圖按照Writing R Extensions手冊,其中規定不一致性得到用C函數
的
getAttrib
和setAttrib
功能,獲取和設置單獨的屬性。他們的第二個參數是SEXP
,它在我們想要的屬性的符號表中定義了名稱;這些和許多這樣的符號在頭文件Rinternals.h
中定義。
另外它還指出..
在R中的
class
只是命名"class"
,因此它可以作爲這樣的處理的屬性。
所以我寫了這個...
# required package
require(inline)
# Simple C function to get "class" attribute of an R object
classC <- cfunction(c(x = "ANY") , '
SEXP out;
PROTECT(out = allocVector(STRSXP, 1));
SET_STRING_ELT(out, 0, mkChar("class"));
UNPROTECT(1);
return getAttrib(x, out) ;
')
但測試它在各種不同類型的[R對象有時會返回class
,但通常返回NULL
。我沒有看到它確實在工作的對象類型之間的連接,所以不知道在哪裏出了問題......
# Various classes of objects
con <- file("text.txt")
d <- data.frame(a = 1)
e <- new.env()
f <- y ~ 1
fun <- function(x) x^2
i <- 1L:10L
l <- list(1 , 2 , 3)
m <- matrix(1 , 10 , 10)
n <- runif(1)
v <- 1:10
和運行我得到的功能...
# Output from the function
classC(con)
#[1] "file" "connection"
classC(d)
#[1] "data.frame"
classC(e)
#NULL
classC(f)
#[1] "formula"
classC(fun)
NULL
classC(i)
NULL
classC(l)
#NULL
classC(m)
#NULL
classC(n)
#NULL
classC(v)
#NULL
我錯過了什麼?我很感興趣,因爲我最終希望編寫一個輔助函數,該函數返回globalenvironment
中所有對象名稱的矢量,它們是特定的class
。但主要是我自己的好奇心和學習,我知道我可以做這樣的事情:
sapply(ls() , function(x) class(get(x)))
+1感謝EDDI,完美。並感謝* easy *出路! –
你確定這是用於S3對象的函數嗎?它看起來像'R_do_data_class'被用於這些。 'R_data_class'之前有一個註釋,它似乎(對我來說)表示它被用於S4類。 –
@ JoshO'Brien哦,我不知道。我認爲這對我來說是一個很好的起點,可以做更多的研究,但我現在不會接受(對不起eddi!),因爲看起來我的原始問題*可能沒有答案,所以不希望人們忽視它。 –