我希望在R中创建多个函数,以便在MonetDB中运行。
函数1(调用查询的select部分)
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)示例使用
stmt <- "SELECT barcode, normalize(welltype_code, data_column1) FROM hcs;"
dbGetQuery(conn, stmt)这个很好用。
函数2(调用查询的select部分)
所以我想要创建一个更高级的版本:
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)正如您所看到的,到目前为止,我唯一改变的是在函数中增加一个额外的参数。
然而,这是失败的:
示例使用:
stmt <- "SELECT normalize2(barcode, welltype_code, data_column1) FROM hcs;"
dbGetQuery(conn, stmt)在以下方面的成果:
!SELECT: no such operator 'normalize2'我查过了,所有类型都很好:
barcode = DOUBLE
welltype_code = CHARACTER LARGE OBJECT
data_column1 = DOUBLE然后,我尝试了另一种在MonetDB中使用函数的方法。
用子查询的结果调用函数
在本例中,我们向函数提供SELECT查询的结果,而不是在查询的列选择部分使用它。
dbGetQuery(conn, "SELECT * FROM normalize2( (SELECT barcode, welltype_code, data_column1 FROM hcs) );")它工作了!
但是,我需要对表的许多列执行此操作。使用第一种语法,我可以执行以下操作:
stmt <- "SELECT barcode, normalize(welltype_code, data_column1), normalize(welltype_code, data_column2) FROM hcs;"
dbGetQuery(conn, stmt)除了连接中间表之外,我不知道如何使用新的查询结构实现类似的结果。(由于这一操作必须在数千列上执行,这可能不是最有效的策略)
所以我的问题归结为:为什么:
SELECT normalize(welltype_code, data_column1) FROM hcs;工作?而不是:
SELECT normalize2(barcode, welltype_code, data_column1) FROM hcs;其次,使用子查询调用它有什么区别?如果这是使用它的唯一方法,那么关于如何以一种有效的方式编写可应用于不同数量的列的函数的指针将受到欢迎。
测试数据:
dput输出:
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")发布于 2016-03-21 09:32:49
投影函数(在SELECT之后使用的函数)只能返回单个列。因此,normalize2的定义应该是
CREATE FUNCTION normalize2(barcode DOUBLE, welltype STRING, data_column DOUBLE)
RETURNS DOUBLE LANGUAGE R { ...而不是
CREATE FUNCTION normalize2(barcode DOUBLE, welltype STRING, data_column DOUBLE)
RETURNS TABLE (i DOUBLE) LANGUAGE R { ...希望这能有所帮助
https://stackoverflow.com/questions/36126948
复制相似问题