首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试:!选择:没有这样的操作符'normalize2‘

调试:!选择:没有这样的操作符'normalize2‘
EN

Stack Overflow用户
提问于 2016-03-21 09:15:41
回答 1查看 71关注 0票数 1

我希望在R中创建多个函数,以便在MonetDB中运行。

函数1(调用查询的select部分)

代码语言:javascript
复制
dbGetQuery(conn, "DROP FUNCTION normalize;")
functionDef <- paste(
    "CREATE FUNCTION normalize(welltype STRING, data_column DOUBLE) RETURNS TABLE (i DOUBLE) LANGUAGE R {", 
    "idx <- which(welltype == 'LC')",
    "100 * data_column / median(data_column[idx])",
    "};", sep = "\n")
dbGetQuery(conn, functionDef)

示例使用

代码语言:javascript
复制
stmt <- "SELECT barcode, normalize(welltype_code, data_column1) FROM hcs;"
dbGetQuery(conn, stmt)

这个很好用。

函数2(调用查询的select部分)

所以我想要创建一个更高级的版本:

代码语言:javascript
复制
dbGetQuery(conn, "DROP FUNCTION normalize2;")
functionDef <- paste(
    "CREATE FUNCTION normalize2(barcode DOUBLE, welltype STRING, data_column DOUBLE) RETURNS TABLE (i DOUBLE) LANGUAGE R {", 
    "idx <- which(welltype == 'LC')",
    "100 * data_column / median(data_column[idx])",
    "};", sep = "\n")
dbGetQuery(conn, functionDef)

正如您所看到的,到目前为止,我唯一改变的是在函数中增加一个额外的参数。

然而,这是失败的:

示例使用:

代码语言:javascript
复制
stmt <- "SELECT normalize2(barcode, welltype_code, data_column1) FROM hcs;"
dbGetQuery(conn, stmt)

在以下方面的成果:

代码语言:javascript
复制
 !SELECT: no such operator 'normalize2'

我查过了,所有类型都很好:

代码语言:javascript
复制
barcode = DOUBLE
welltype_code = CHARACTER LARGE OBJECT
data_column1 = DOUBLE

然后,我尝试了另一种在MonetDB中使用函数的方法。

用子查询的结果调用函数

在本例中,我们向函数提供SELECT查询的结果,而不是在查询的列选择部分使用它。

代码语言:javascript
复制
dbGetQuery(conn, "SELECT * FROM normalize2( (SELECT barcode, welltype_code, data_column1 FROM hcs) );")

它工作了!

但是,我需要对表的许多列执行此操作。使用第一种语法,我可以执行以下操作:

代码语言:javascript
复制
stmt <- "SELECT barcode, normalize(welltype_code, data_column1), normalize(welltype_code, data_column2) FROM hcs;"
dbGetQuery(conn, stmt)

除了连接中间表之外,我不知道如何使用新的查询结构实现类似的结果。(由于这一操作必须在数千列上执行,这可能不是最有效的策略)

所以我的问题归结为:为什么:

代码语言:javascript
复制
SELECT normalize(welltype_code, data_column1) FROM hcs;

工作?而不是:

代码语言:javascript
复制
SELECT normalize2(barcode, welltype_code, data_column1) FROM hcs;

其次,使用子查询调用它有什么区别?如果这是使用它的唯一方法,那么关于如何以一种有效的方式编写可应用于不同数量的列的函数的指针将受到欢迎。

测试数据:

dput输出:

代码语言:javascript
复制
structure(list(barcode = c(110000184638, 110000184638, 110000184638, 
110000184638, 110000184638, 110000184638, 110000184638, 110000184638, 
110000184638, 110000184638), welltype_code = c("LC", "LC", "LC", 
"LC", "LC", "LC", "LC", "LC", "LC", "LC"), data_column1 = c(0.344772189855576, 
0.334164410829544, 0.315271258354187, 0.320378184318542, 0.322041183710098, 
0.32072114944458, 0.29565417766571, 0.321962893009186, 0.298929244279861, 
0.323741465806961)), .Names = c("barcode", "welltype_code", "data_column1"
), row.names = c(NA, 10L), class = "data.frame")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 09:32:49

投影函数(在SELECT之后使用的函数)只能返回单个列。因此,normalize2的定义应该是

代码语言:javascript
复制
CREATE FUNCTION normalize2(barcode DOUBLE, welltype STRING, data_column DOUBLE)
RETURNS DOUBLE LANGUAGE R { ...

而不是

代码语言:javascript
复制
CREATE FUNCTION normalize2(barcode DOUBLE, welltype STRING, data_column DOUBLE) 
RETURNS TABLE (i DOUBLE) LANGUAGE R { ...

希望这能有所帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36126948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档