“Model”是“命名空间”,但此处被当做“类型”来使用,是啥原因导致的哦,这段代码我写
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“Model”是“命名空间”,但此处被当做“类型”来使用,是啥原因导致的哦,这段代码我写相关的知识,希望对你有一定的参考价值。
在业务逻辑层里面
例如 public static int InsertData(Model M)
然后你说的Model是命名空间,这个是不冲突的,我可以有一个命名空间叫Model,而在这个命名空间下面我有一个类叫Model,你可以引用Model这个命名空间,也能使用Model这个类型,因为你在使用这个Model类的时候,实际上是用的Model.Model(前面是命名空间,后面是类)
所以啦,,是ok的啦。只是以后你的命名空间可以稍微写的详细点,避免和类名重复产生误会,比如使用Net.Zone.Model这种长一点的命名空间,最好是有意义的 参考技术A Model M这个地方不对,你的程序中有Model这个命名空间,但是没有Model这个类型(结构体或者是类),所以你需要修改一下,在有些语言中,如果是Model命名空间下的Model类的话,你可以使用Model.Model这种完整的路径表示 参考技术B Model M 写法不对,应该是(命名空间.某某Model M),因为你不写命名空间的话 Vs找不到具体的Model 参考技术C 在前面加上命名空间.. 比如Model.Model
R:临时覆盖函数和范围/命名空间
【中文标题】R:临时覆盖函数和范围/命名空间【英文标题】:R: temporarily overriding functions and scope/namespace 【发布时间】:2012-03-12 13:45:36 【问题描述】:考虑以下 R 代码:
local(
lm <- function(x) x^2
lm(10)
)
这会暂时覆盖lm
函数,但一旦local
被执行,它将“恢复正常”。我想知道为什么相同的方法在下一个简单示例中似乎不起作用:
require(car)
model <- lm(len ~ dose, data=ToothGrowth)
local(
vcov <- function(x) hccm(x) #robust var-cov matrix
confint(model) # confint will call vcov, but not the above one.
)
confint
函数使用 vcov
函数来获得系数的标准误差,其想法是通过临时覆盖 vcov
来使用稳健的 var-cov 矩阵,而无需“手动”执行操作或更改函数.
vcov 和 confint 都是通用函数,我不知道这是否是它无法按预期工作的原因。这不是我感兴趣的具体例子;而是概念课。这是命名空间还是范围“问题”?
【问题讨论】:
【参考方案1】:我们展示了如何使用代理对象来做到这一点(请参阅此document 的代理部分),首先使用proto package,然后不使用:
1) 原型。由于confint.lm
正在调用vcov
,我们需要确保(a)我们对vcov
的新替换是在修改后的confint.lm
的环境中,并且(b)修改后的confint.lm
仍然可以从其访问对象原版的。 (例如confint.lm
在stats中调用了隐藏函数format.perc
,所以如果我们不安排第二点为真,隐藏函数就无法访问。)
为了执行上述操作,我们创建了一个新的confint.lm
,除了它有一个新环境(代理环境),其中包含我们的替换vcov
,其父级是原始confint.lm
环境。下面,代理环境被实现为一个原型对象,这里要知道的关键项目是:(a) 原型对象是环境和 (b) 将函数放置在原型对象中,以显示的方式将其环境更改为该原型对象.此外,为了避免 S3 将 confint
分派到 confint.lm
时出现任何问题,我们直接调用 confint.lm
方法。
虽然hccm
在这里似乎没有任何不同的结果,但我们可以通过注意trace
的输出来验证它是否已运行:
library(car)
library(proto)
trace(hccm)
model <- lm(len ~ dose, data=ToothGrowth)
proto(environment(stats:::confint.lm), # set parent
vcov = function(x) hccm(x), #robust var-cov matrix
confint.lm = stats:::confint.lm)[["confint.lm"]](model)
另一个例子,见例子2here。
2) 环境。没有 proto 的代码有点繁琐(实际上它大约使代码大小翻了一番)但这里是:
library(car)
trace(hccm)
model <- lm(len ~ dose, data=ToothGrowth)
local(
vcov <- function(x) hccm(x) #robust var-cov matrix
confint.lm <- stats:::confint.lm
environment(confint.lm) <- environment()
confint.lm(model) # confint will call vcov, but not the above one.
, envir = new.env(parent = environment(stats:::confint.lm)))
编辑:清晰度的各种改进
【讨论】:
太棒了,我不熟悉 proto 包,但它似乎很有用。我继续阅读小插图,这是一本很好的书。感谢您的努力!【参考方案2】:这是因为函数confint
和vcov
都在命名空间“stats”中。您在此处调用的 confint() 有效地获取了 stats::vcov,这很大程度上是因为这就是名称空间的用途 - 您可以编写自己的版本,但不会损害其他预期的行为。
在您的第一个示例中,您仍然可以安全地调用其他依赖于 stats::lm 并且不会因您的本地修改而感到不安的函数。
【讨论】:
好的,所以除了 class(model)以上是关于“Model”是“命名空间”,但此处被当做“类型”来使用,是啥原因导致的哦,这段代码我写的主要内容,如果未能解决你的问题,请参考以下文章
vs2008中的错误 1 找不到类型或命名空间名称“Graphics”(是不是缺少 using 指令或程序集引用?)怎么解决?急