F#: 找不到或无效的程序集引用 RDotNet.dll

3

你能找到这个汇编文件吗? - scrwtp
1
这应该会有所帮助:F# Interactive #I 命令如何知道项目路径? 我还建议,如果您正在使用 VS,那么您可以打开一个 F# 项目,在 VS 中使用 NuGet 安装 R,将 R 添加到项目的引用中,然后从项目中打开 F# Interactive。然后,示例应该可以正常工作。让它正常工作的诀窍是正确设置 __SOURCE_DIRECTORY__ - Guy Coder
我在电脑上找到了它,但出于某些原因我无法将其添加到我的参考资料中。&& @程序员小伙子,我会尝试的。 - Souf
@GuyCoder 谢谢,这个有效! - Souf
1
你应该将确切的细节作为答案发布并获得一些积分。屏幕截图也很好。还要在答案中引用其他页面。同时,使用 printfn __SOURCE_DIRECTORY__ 显示无效的路径和正确的路径。 - Guy Coder
3个回答

3

使用Visual Studio 15 (我使用免费的社区版)
创建新的F#控制台项目:UseNuGetPackage(不提供具体步骤)

enter image description here

请下载并安装R(不提供具体步骤)

安装R类型提供程序

在Visual Studio中使用解决方案资源管理器
右键单击F#项目,例如UseNuGetPackage
选择:管理解决方案的NuGet包

enter image description here

点击浏览
输入:RProvider
点击项目左侧的复选框

enter image description here

点击安装

enter image description here

点击确定

Visual Studio输出窗口显示:

Attempting to gather dependencies information for package 'RProvider.1.1.15' with respect to project 'UseNuGetPackage', targeting '.NETFramework,Version=v4.5.2'
Attempting to resolve dependencies for package 'RProvider.1.1.15' with DependencyBehavior 'Lowest'
Resolving actions to install package 'RProvider.1.1.15'
Resolved actions to install package 'RProvider.1.1.15'
Adding package 'DynamicInterop.0.7.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'DynamicInterop.0.7.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'DynamicInterop.0.7.4' to 'packages.config'
Successfully installed 'DynamicInterop 0.7.4' to UseNuGetPackage
Adding package 'R.NET.Community.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.1.6.4' to 'packages.config'
Successfully installed 'R.NET.Community 1.6.4' to UseNuGetPackage
Adding package 'R.NET.Community.FSharp.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.FSharp.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.FSharp.1.6.4' to 'packages.config'
Successfully installed 'R.NET.Community.FSharp 1.6.4' to UseNuGetPackage
Adding package 'RProvider.1.1.15' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'RProvider.1.1.15' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'RProvider.1.1.15' to 'packages.config'
Successfully installed 'RProvider 1.1.15' to UseNuGetPackage
========== Finished ==========

请注意下面的图片中绿色的勾号,表示软件包已安装。

enter image description here

请注意下图中项目的新引用。

enter image description here

为了使以下两个语句正常工作,我们需要验证一些路径。
#I "../packages/RProvider.1.0.11"
#load "RProvider.fsx"

给出的示例是特定于某个版本的,由于我们知道版本会发生变化,所以请检查将要使用的DLL的版本。
在F#项目中, 右键单击RProvider引用, 右键单击属性。

enter image description here

enter image description here

这里是完整路径,所以您不必眯着眼睛看

c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages\RProvider.1.1.15\lib\net40\RProvider.dll

该示例使用的是版本 RProvider.1.0.11,而我们有 RProvider.1.1.15,因此需要更新示例中的行。
#I "../packages/RProvider.1.1.15"

如果您查看许多从NuGet下载软件包并在F# Interactive中使用它的示例,您将看到启动它的相同模式。
#I "../packages/<Name_XYZ>.<Version>"
#load "<Name_XYZ>.fsx"

这是因为此代码假定您已经使用NuGet在VS项目中安装了所需的DLL,并且DLL位于相对于项目源代码的packages目录中。如果您回顾我提供的输出窗口清单,您将看到DLL的复制。

这里它们在文件资源管理器中显示出来。

enter image description here

那么,当F# Interactive只有相对路径时,它是如何知道如何找到DLL的呢?
现在让我们揭示一个被省略的神奇部分,因为这是考验新手的阴谋。:-)
F# Interactive具有属性__SOURCE_DIRECTORY__,它提供了VS项目中源目录的位置。可以在F# Interactive中看到这一点。
printfn __SOURCE_DIRECTORY__

这对我的例子来说是

c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\UseNuGetPackage
val it : unit = ()

如果您获取到包含AppData的目录,则请重新启动F# Interactive。

可以使用文件资源管理器进行检查。

enter image description here

当然,这是项目的源目录。
更重要的是,从源目录到NuGet包的路径是:
../packages

所以所有的路径看起来都很好。

现在我们已经更新并检查了加载DLL的脚本行,请尝试一下。

我们会收到以下错误:

error FS0082: Could not resolve this reference. Could not locate the assembly "RDotNet.FSharp.dll".

问题在于中提到的具体版本。
// Standard NuGet locations for R.NET
#I "../R.NET.Community.1.5.16/lib/net40"
#I "../R.NET.Community.FSharp.0.1.9/lib/net40"

如果我们用以下内容替换#load "RProvider.fsx"
#r "../packages/R.NET.Community.1.6.4/lib/net40/RDotNet.dll"
#r "../packages/R.NET.Community.FSharp.1.6.4/lib/net40/RDotNet.FSharp.dll"
#r "../packages/RProvider.1.1.15/lib/net40/RProvider.dll"
#r "../packages/RProvider.1.1.15/lib/net40/RProvider.Runtime.dll"

open RProvider
do fsi.AddPrinter(fun (synexpr:RDotNet.SymbolicExpression) -> synexpr.Print())

open System
open RDotNet
open RProvider
open RProvider.graphics
open RProvider.stats

这个例子有效。例如。

// Random number generator
let rng = Random()
let rand () = rng.NextDouble()

// Generate fake X1 and X2 
let X1s = [ for i in 0 .. 9 -> 10. * rand () ]
let X2s = [ for i in 0 .. 9 -> 5. * rand () ]

// Build Ys, following the "true" model
let Ys = [ for i in 0 .. 9 -> 5. + 3. * X1s.[i] - 2. * X2s.[i] + rand () ]

let dataset =
    namedParams [
        "Y", box Ys;
        "X1", box X1s;
        "X2", box X2s; ]
    |> R.data_frame

let result = R.lm(formula = "Y~X1+X2", data = dataset)

let coefficients = result.AsList().["coefficients"].AsNumeric()
let residuals = result.AsList().["residuals"].AsNumeric()

let summary = R.summary(result)
summary.AsList().["r.squared"].AsNumeric()

R.plot result

正如Tomas在他的回答中指出的那样,fsx文件中存在版本号错误,但他能够更新源代码并制作新的alpha版本。 :)

希望我提供了足够的细节,这样下次当你遇到使用NuGet包与F# Interactive的例子时,如果有问题,你可以解决它。


1

RProvider.fsx中存在一个错误,它引用了错误版本的R.NET。版本1.1.16-alpha已经修复了这个问题, 但我们还没有发布新的非测试版。

如果您安装了1.1.16-alpha,您能否检查它是否正常工作?


0

@GuyCoder 的链接帮了我: F# Interactive #I 命令如何知道项目路径?

我在电脑上搜索了缺失的 .dll 文件,并将其粘贴到源目录的父文件夹中。之后一切都正常工作了。

    #I "../packages/RProvider.1.1.15"
(*
#r "RDotNet.dll"
#r "RDotNet.FSharp.dll"
These 2 are unnecessary*)
#load "RProvider.fsx"


open System
open RDotNet
open RProvider
open RProvider.graphics
open RProvider.stats

My directory

编辑:

我首先下载了nuget包Rdotnet和Rdotnet.Fsharp,然后在我的计算机上搜索dll文件,

然后我将这些文件复制并粘贴到我正在工作的目录中:

您也可以使用__SOURCE_DIRECTORY__找到它


编辑得更好了,但答案是错误的。您需要删除所复制的文件并找出如何使用正确设置__SOURCE_DIRECTORY__启动F#交互,以便提供者页面上给出的示例可以正常工作。这就是该评论试图解释的内容。 - Guy Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接