查看R源代码(names.c
):
{"is.null", do_is, NILSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.logical", do_is, LGLSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.integer", do_is, INTSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.double", do_is, REALSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.complex", do_is, CPLXSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.character", do_is, STRSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.symbol", do_is, SYMSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.name", do_is, SYMSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.environment",do_is, ENVSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.list", do_is, VECSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.pairlist", do_is, LISTSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.expression", do_is, EXPRSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.raw", do_is, RAWSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.object", do_is, 50, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"isS4", do_is, 51, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.numeric", do_is, 100, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.matrix", do_is, 101, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.array", do_is, 102, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.atomic", do_is, 200, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.recursive", do_is, 201, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.call", do_is, 300, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.language", do_is, 301, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.function", do_is, 302, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
...
显示objects
(50)是一种特定类型,不同于function
(302)或其他类型(如numeric
, matrix
等)。
这在coerce.c
中的do_is
定义中得到确认:
case 50:
LOGICAL0(ans)[0] = OBJECT(CAR(args));
break;
对象具有以下方法:
/* Objects */
{"inherits", do_inherits, 0, 11, 3, {PP_FUNCALL, PREC_FN, 0}},
{"UseMethod", do_usemethod, 0, 200, -1, {PP_FUNCALL, PREC_FN, 0}},
{"NextMethod", do_nextmethod, 0, 210, -1, {PP_FUNCALL, PREC_FN, 0}},
{"standardGeneric",do_standardGeneric,0, 201, -1, {PP_FUNCALL, PREC_FN, 0}},
指向R基础文档的点:
R拥有一种简单的通用函数机制,可用于面向对象式编程。方法分发是基于通用函数的第一个参数或作为UseMethod或NextMethod参数提供的对象的类进行的。
这表明类型为50的对象(通过is.object
检测)只是S3类或S4类,并在is.object
文档中得到确认:
is.object
- 对象是否被内部分类?如果对象x具有R内部OBJECT位,则返回TRUE,否则返回FALSE。当添加“class”属性时,将设置OBJECT位,而当删除该属性时,将删除该位,因此这是一种非常有效的检查对象是否具有类属性的方法。(S4对象总是应该有。)
简而言之:内部对象已设置class
属性。
与普通语言中的对象相比,这相当受限制。不确定R文档在谈论对象时是否总是指objects(50)
。
关于names(function())
错误,请参见@nicola的澄清。
assign(x = "square", function(x) x*x)
- MrSmithGoesToWashingtonassign("square", function(x) x*x)
即square<-function(x) x*x
。 - J. Minisquare(24)
成为可接受的代码呢? - MrSmithGoesToWashingtonnames
函数。 - J. Mini