R-функция nls() прекрасно работает в R Studio, но не в SQL Server 2016
Я новичок в SQL Server с R Services, и я пытаюсь реализовать nls()
Функция внутри хранимой процедуры, чтобы найти наиболее подходящую кривую, которая описывает данные, которые возвращает SP. Следующая функция nls() с конкретными аргументами работает правильно в R Studio
но, наоборот, выдает ошибку при попытке запустить его внутри хранимой процедуры в SQL Server. Имейте в виду, что набор данных, который я загружаю в R Studio
совпадает с результатом оператора Select, который используется внутри хранимой процедуры.
Хранимая процедура:
DROP TABLE IF EXISTS #TempTable
CREATE TABLE #TempTable (x NVARCHAR(MAX), y NVARCHAR(MAX))
INSERT INTO #TempTable
EXEC [dbo].[proc_ReturnDataForCurveGraphsDoubleNorm]
@sRAWFILEID = N'5542', @PREBLEACHVALUES = 50, @BLEACHVALUES = 1, @INITIALBLEACHVALUES = 0
execute sp_execute_external_script
@language = N'R'
,@script = N'
df <- as.data.frame(c(InputDataSet));
xdata <- df[,1];
ydata <- df[,2];
m = nls(y ~ yo - a*exp(-b*x), data = df, start = list(yo = 0.5, a = 0.563, b = 0.9), trace = F, control = list(maxiter = 1000), lower = list(0, 0, 0),upper = list(100, 100, 1), algorithm = "port");
OutputDataSet <- data.frame(xdata, ydata);'
,@input_data_1 = N' SELECT * FROM #TempTable;'
WITH RESULT SETS (([x] NVARCHAR(MAX), [y] NVARCHAR(MAX) ));
Ошибка, которую я получаю:An external script error occurred: Error in numericDeriv(form[[3L]], names(ind), env, ifelse(internalPars < : Missing value or an infinity produced when evaluating the model
Строка кода, которая правильно выполняется в R Studio, выглядит следующим образом:
m = nls(y ~ yo - a*exp(-b*x), data = df, start = list(yo = 0.5, a = 0.563, b = 0.9), trace = F, control = list(maxiter = 1000), lower = list(0, 0, 0),upper = list(100, 100, 1), algorithm = "port");
Также это разновидность данных (всего 400 строк):
x y
1 2.692 0.163956
2 2.744 0.222050
3 2.795 0.261590
4 2.847 0.312176
5 2.898 0.335091
6 2.950 0.365475
7 3.002 0.389842
8 3.053 0.422475
9 3.105 0.446906
10 3.157 0.464013
11 3.209 0.479566
12 3.260 0.508908
13 3.312 0.503733
14 3.364 0.521298
15 3.416 0.538741
16 3.468 0.557562
17 3.520 0.562461
18 3.572 0.578120
19 3.624 0.607666
20 3.676 0.623594
21 3.728 0.625253
22 3.779 0.620704
23 3.831 0.629850
24 3.882 0.645155
25 3.934 0.660781
26 3.986 0.667858
27 4.038 0.685587
28 4.090 0.662437
29 4.142 0.672041
30 4.194 0.683506
31 4.245 0.708125
32 4.297 0.700848
33 4.349 0.692869
34 4.401 0.735460
35 4.453 0.715026
36 4.505 0.743622
37 4.557 0.728900
38 4.609 0.732680
39 4.661 0.737960
40 4.712 0.746198
41 4.764 0.752706
42 4.816 0.754294
43 4.867 0.772323
44 4.919 0.753392
45 4.970 0.776535
46 5.022 0.769763
47 5.074 0.793794
48 5.126 0.803506
49 5.177 0.803348
50 5.229 0.786406
....
....
380 22.362 0.936958
381 22.414 0.943523
382 22.466 0.945731
383 22.518 0.945423
384 22.570 0.924267
385 22.622 0.913668
386 22.674 0.938850
387 22.726 0.922154
388 22.778 0.927627
389 22.830 0.942964
390 22.882 0.941946
391 22.934 0.928719
392 22.986 0.954385
393 23.038 0.954852
394 23.089 0.937320
395 23.142 0.939765
396 23.194 0.936664
397 23.246 0.932192
398 23.297 0.931064
399 23.349 0.929592
400 23.402 0.936149
Мне действительно интересно, в чем проблема в SQL Server
тот R Studio
избегает.
1 ответ
Таблица SQL (#TempTable), используемая в качестве параметра input_data_1 в sp_execute_external_script, использует тип данных NVARCHAR(max) для столбцов. NVARCHAR
в типе SQL отображается на character
введите R и dataframe будет обрабатывать строки как factor
введите по умолчанию. Для передачи данных в виде числового типа в R вам потребуется использовать соответствующий тип данных SQL.
См. Типы данных (Transact-SQL) и Работа с типами данных R для получения дополнительной информации.