我正在学习R(我本周才开始),我一直在努力学习typeof,mode,storage.mode和class的概念.我一直在上下搜索(官方R文档,StackOverflow,谷歌等),我无法找到任何明确的解释这些之间的区别.(一些StackOverflow 和 CrossValidated答案并没有真正帮助我解决问题.)最后(我希望),我想我明白了,所以我的问题是验证我的理解是否正确.
mode vs storage.mode: mode和storage.mode基本相同,除了处理"单一"数据类型的微小差别.
mode vs typeof: 非常相似,除了一些差异,最值得注意的是两者(typeof"integer"和"double")=(mode"numeric"); 两者(typeof"special"和"builtin"=(mode"function").
class: Class基于R的面向对象的类层次结构.我很难找到这个图形化的布局,但我能找到的最好的是这个图:
(如果有人能指出我更准确的R类层次结构,我会替换它.)
虽然类名与R class()函数的结果不完全对应,但我认为层次结构基本上是准确的.我的理解是对象的"类" - 即class()函数的结果 - 是层次结构中的根类.因此,例如,"Vector"不是根类,因此它永远不会显示为class()函数的结果.根类可能更像是"StrVector"("字符")或"BoolVector"("逻辑").相比之下,"矩阵"本身就是一个根类; 因此,它的类是"矩阵".
显然,R支持多重继承,因此一些对象可以有多个类.
typeof/mode/storage.mode vs class:这是我最难理解的部分.我现在的理解是:typeof/mode/storage.mode(我将其称之为"模式")基本上是R对象可以作为其值之一保存的最复杂的数据类型.因此,例如,由于矩阵,数组和向量只能包含一个向量数据类型,因此它们的模式(即它们可以容纳的最复杂的数据类型)通常是数字,字符或逻辑,即使它们的类(它们在类中的位置)等级)是完全不同的东西.
这最有趣的地方(也就是混乱)就像列表这样的对象."列表"模式意味着对象中的每个值本身可以是一个列表(即,可以包含不同数据类型的对象).因此,无论类本身是否为"列表",都有多个对象(例如数据帧)可以包含不同的值,因此其模式是"列表",即使它们的类是其他的.
总而言之,我的理解是:
typeof/mode/storage.mode(几乎相同的东西)基本上是R对象可以作为其值之一保存的最复杂的数据类型; 而
class是根据R类层次结构的对象的面向对象分类.
我的理解准确吗?如果没有,有人可以给出更准确的解释吗?
在 ERD 中,弱/非识别关系是连接两个强实体的关系,用虚线表示。强/识别关系是一种将强实体连接到弱实体的关系(弱实体是一种包含来自其相关实体的外键 [FK] 作为其自己的主键 [PK] 的组成部分),并被指示用实线。
我的问题是,那又怎样?为什么区分弱/非识别关系与强/识别关系如此重要,以至于 ERD 设计者应该分别用虚线和实线进行区分?为什么这么重要?
对我来说,ERD 中的每个元素和约定都应该添加必要的信息,这些信息要么直接转换为数据库设计(即 DDL SQL 语句),要么至少解释重要但不一定明显的信息(以及最后一种情况的示例)将命名关系 - 它们不会转换为 SQL,但它们对于理解 ERD 非常有用)。为了讨论起见,这是一个示例 ERD(从另一个 StackOverflow 问题修改而来):
我已经考虑了很多,对我来说,实线与虚线添加的唯一信息已经在以下约定中得到充分传达:
据我所知,实线与虚线的关系线没有增加额外的有用信息。这种约定不是添加信息,而是不直观且非常混乱。作为它们造成的混淆的一个例子,StackOverflow 上有许多重复的问题,询问哪个是哪个;这里只是几个例子:
任何人都可以向我解释约定添加的哪些附加信息不包含在 FK 可能是也可能不是 PK 的一部分这一事实中?我正在认真考虑完全忽略约定(也就是说,我想开始用所有实线绘制我的 ERD),但如果有人能指出我忽略的重要内容,我将不胜感激。
这基本上与dplyr with %>% pipeline 中的链算术运算符相同的问题,但针对新的(如 R 4.1)管道运算符进行了更新|>
。
如何将算术运算符与 R 本机管道链接起来|>
?使用 dplyr/magrittr,您可以对算术运算符使用反引号,但这不适用于内置的 R 管道运算符。这是一个简单的例子:
R.version$version.string
# [1] "R version 4.2.2 (2022-10-31 ucrt)"
x <- 2
# With dplyr/magrittr, you can use backticks for arithmetic operators
x %>% `+`(2)
# [1] 4
# But that doesn't work with the inbuilt R pipe operator
x |> `+`(2)
# Error: function '+' not supported in RHS call of a pipe
Run Code Online (Sandbox Code Playgroud)
希望答案足够通用,适用于通常不能与本机 R 管道很好地配合的任何运算符或内置函数(我的版本是 R 4.2.2)。
答案/sf/answers/5046054471/有很多关于 …
我使用DataCamp在线学习R。有时我想导出练习中使用的数据,但我找不到简单的方法。
我知道有下载视频或幻灯片的说明,有些课程在课程描述中提供了一些选定的数据集供下载。但是,如何下载可以通过 DataCamp 练习界面访问的数据,以便导出到平台之外呢?
我正在编写一个用于统计分析和机器学习 (ML) 的 R 包,该包通常非常慢。它很慢,因为它涉及训练和预测模型,包括统计和机器学习。我的包与模型无关,我的意思是它与 R 中的任何其他模型训练和预测包接口,以重新训练他们的模型并使用他们的模型进行预测。经过广泛的分析和代码重构(主要是通过尽可能多地转换为向量化和矩阵运算),我发现无法通过重构进一步加快速度的慢点归结为以下代码:
我想知道Rcpp是否可以帮助加快我的情况。请注意我在这里没有问什么:
我对Rcpp是否有帮助的主要疑问是,最慢的代码是当我调用其他包的 R 函数时。我已经阅读了大量有关 Rcpp 的文章,甚至正在参加有关该主题的 DataCamp 课程。然而,从我目前对 Rcpp 的探索来看,尽管许多资料解释了为什么我们要使用 Rcpp(以加速缓慢的 R 代码),但我无法找到任何资料来清楚地说明 Rcpp 无法帮助解决哪些问题。
据我所知,Rcpp 在调用 R 函数时无法提供任何加速。减慢我的代码速度的函数是由其他包编写的函数。例如,我有一篇文章演示了我的包功能,分别使用nnet::nnet()
和nnet::predict.nnet()
来训练和预测神经网络,以及分别使用gbm::gbm()
和gbm::predict.gbm()
来训练和预测梯度增强机。有没有办法使用Rcpp来优化这些函数的调用?
如果我可以Rcpp::cppFunction()
实时调用来接收这些函数,将它们编译为 C++,然后继续用我的程序执行它们,那么这可能是一个可行的解决方案。但这对于 Rcpp 来说可能吗?我将不胜感激这里的任何指导。我愿意接受一个明确解释的答案:“不,Rcpp 无法帮助您解决问题,原因如下。”