- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 S4 类构建 R 包,但在使用 new
时遇到了问题功能。我有一个类(class)叫 Configs
setClass("Configs",
slots = list(
burnin = "numeric",
chains = "numeric",
features = "numeric",
iterations = "numeric",
mphtol = "numeric",
samples = "numeric",
seed = "numeric",
thin = "numeric",
verbose = "numeric"
),
prototype = list(
burnin = 0,
chains = 2,
features = 5,
iterations = 5,
mphtol = 1e-4,
samples = 3,
seed = sample(1e6, 1),
thin = 0,
verbose = 0
)
)
Configs
插槽与默认值不同的对象。
> new("Configs", features = 1000)
An object of class "Configs"
Slot "burnin":
[1] 0
Slot "chains":
[1] 2
Slot "features":
[1] 1000
Slot "iterations":
[1] 5
Slot "mphtol":
[1] 1e-04
Slot "samples":
[1] 3
Slot "seed":
[1] 437211
Slot "thin":
[1] 0
Slot "verbose":
[1] 0
new("Configs", features = 1000)
, 我得到一个
features
5. 为什么不
new()
再把值放在插槽中?
R CMD check
没有任何错误、警告或注释。这是我的 session 信息。
> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] heterosis_0.0 pracma_1.8.3 MCMCpack_1.3-3 MASS_7.3-40 coda_0.17-1
loaded via a namespace (and not attached):
[1] tools_3.2.0 grid_3.2.0 lattice_0.20-31
initialize
功能导致问题。
setMethod("initialize", "Configs", function(.Object, ...){
# .Object = new("Configs", ...)
validObject(.Object)
return(.Object)
})
new
再次将东西放入插槽中。我很高兴我发现了这个问题,但我不想完全删除我的初始化函数。我想要一种方便的方法来调用 validObject 并进行其他错误检查,还有
initialize
似乎是一个适当和合适的地方。如果我取消注释注释行,我会得到无限递归。如何在不破坏的情况下创建构造函数
new
?
最佳答案
initialize()
是双重目的——初始化和复制构造。提供显式构造函数通常更好(也为用户提供更多信息)
.A = setClass("A", representation(x="numeric"))
A = function(x=numeric(), ...)
.A(x=x, ...)
validOjbect()
当对象创建涉及插槽分配时,由默认 initialize 方法调用,因此无需在您自己的 initialize 方法期间显式调用它(见下文);也许你会有
.A = setClass("A", representation(x="numeric"),
prototype=prototype(x=NA_integer_))
setValidity("A", function(object) {
if (length(object@x) != 1L)
"'x' must be length 1"
else TRUE
})
A = function(x=NA_integer_, ...)
## signature is informative -- 'x' is integer(1), not just '...'
## coercion (e.g., as.integer(), below) and other set-up
new("A", x=as.integer(x), ...)
> A()
An object of class "A"
Slot "x":
[1] NA
> A(x=1)
An object of class "A"
Slot "x":
[1] 1
> A(x=1:2)
Error in validObject(.Object) :
invalid class "A" object: 'x' must be length 1
prototype()
必须定义以创建有效对象(使用
validObject(new("A"))
验证这一点。
.B = setClass("B",
representation(x="numeric", y="numeric"),
prototype=prototype(x=NA_integer_, y=NA_real_))
setMethod("initialize", "B",
function(.Object, ..., x=.Object@x, y=.Object@y)
{
## pre-processing, then invoke 'next' initialize() method
## base initialize() creates the object then calls validObject()
## so no need for explicit test of validity
.Object <- callNextMethod(.Object, ..., x=x, y=y)
## post-processing
.Object
})
initialize()
继续充当复制构造函数
> b = new("B", x=1, y=2) # constructor
> initialize(b, x=2) # copy-constructor
An object of class "B"
Slot "x":
[1] 2
Slot "y":
[1] 2
initialize()
而付出努力。正确的。
initialize()
的契约(Contract)。 ,
setClass("C", representation(x="numeric", y="numeric")) # default initialize()
new()
调用时,它实际上充当复制构造函数
> c = new("C", x=1, y=2)
> new("C", c, x=2)
An object of class "C"
Slot "x":
[1] 2
Slot "y":
[1] 2
> b = new("B", x=1, y=2)
> new("B", b, x=2)
An object of class "B"
Slot "x":
[1] 2
Slot "y":
[1] NA
关于r - S4 类 : arguments passed to new() don't go into their slots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562141/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!