R 4.1.0著名地引入了(“基管道”)运算|>符和类似 Haskell 的 lambda 函数语法。
我认为可以将两者结合起来,如下所示:
c(1, 2, 3) |> \(x) 2 * x
Run Code Online (Sandbox Code Playgroud)
这对我来说失败了:
错误:管道的 RHS 调用不支持函数“function”
因此我认为这不是有效的语法?这有效:
c(1, 2, 3) |> (\(x) 2 * x)()
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来链接管道和新的 lambda 函数?
我编写了一个小的 parsec 解析器来从用户提供的输入字符串或输入文件中读取样本。如果输入作为分号分隔的字符串提供,它会在错误输入时正确失败并显示有用的错误消息:
> readUncalC14String "test1,7444,37;6800,36;testA,testB,2000,222;test3,7750,40"
*** Exception: Error in parsing dates from string: (line 1, column 29):
unexpected "t"
expecting digit
Run Code Online (Sandbox Code Playgroud)
但是对于inputFile.txt具有相同条目的输入文件,它会静默失败:
test1,7444,37
6800,36
testA,testB,2000,222
test3,7750,40
Run Code Online (Sandbox Code Playgroud)
> readUncalC14FromFile "inputFile.txt"
[UncalC14 "test1" 7444 37,UncalC14 "unknownSampleName" 6800 36]
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我如何才能readUncalC14FromFile以有用的方式失败?
这是我的代码的最小子集:
import qualified Text.Parsec as P
import qualified Text.Parsec.String as P
data UncalC14 = UncalC14 String Int Int deriving Show
readUncalC14FromFile :: FilePath -> IO [UncalC14]
readUncalC14FromFile uncalFile = do
s <- readFile uncalFile
case P.runParser uncalC14SepByNewline () …Run Code Online (Sandbox Code Playgroud) 我有一种类型来描述校准后放射性碳日期概率分布。细节和背景对于这个问题并不重要:它归结为 中_calPDFDens每一年的一个概率值_calPDFCals:
data CalPDF = CalPDF {
-- | Sample identifier, e.g. a lab number
_calPDFid :: String
-- | Years calBCAD
, _calPDFCals :: VU.Vector YearBCAD
-- | Probability densities for each year in '_calPDFCals'
, _calPDFDens :: VU.Vector Float
}
Run Code Online (Sandbox Code Playgroud)
(VU是Data.Vector.Unboxed)
现在:通常的做法是对多个此类分布求和以得出总和概率分布。这意味着对 中的年份进行完全外部联接_calPDFCals,然后对 中的相应值求和_calPDFDens。我的实现如下:
sumPDFs :: CalPDF -> CalPDF -> CalPDF
sumPDFs = combinePDFs (+)
combinePDFs :: (Float -> Float -> Float) -> CalPDF …Run Code Online (Sandbox Code Playgroud) 当我安装docker并运行时,service docker start我收到此消息:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
Run Code Online (Sandbox Code Playgroud)
我跑的时候journalctl -xe收到了这条消息:
8? 02 20:42:11 centos-master systemd[1]: Unit docker-storage-setup.service entered failed state.
8? 02 20:42:11 centos-master systemd[1]: docker-storage-setup.service failed.
8? 02 20:42:11 centos-master systemd[1]: Starting Docker Application Container Engine...
-- Subject: Unit docker.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has begun starting up.
8? 02 …Run Code Online (Sandbox Code Playgroud) 我有一个自定义的S3类foo,它在常规的顶部添加了一些自定义行为data.frame:
foo_object <- data.frame()
class(foo_object) <- c("foo", "data.frame")
Run Code Online (Sandbox Code Playgroud)
对于此类,还应该有一个列表类foo_list来存储许多这些foo对象。
foo_list_object <- list()
class(foo_list_object) <- c("foo_list", "list")
Run Code Online (Sandbox Code Playgroud)
如果通过这样对列表上的多个元素应用子集操作,则foo_list_object[c(1,2,3)]只会得到class的对象list。但是我希望它保持不变foo_list。
Hadley 说,您应该为向量类实现自定义访问器函数,以实现此行为:
实现矢量类时,应实现以下方法:length,[,[<-,[[,[[<-,c。(如果[实现了rev,则头和尾都应该工作)。
我的问题包括三个部分:
[[,[<-,[[<-或者$因为在这些情况下的继承功能的list行为正确也foo_list。我还是应该实施它们吗?[<-或)的运算符[[<-?您需要对象,索引和新值吗?以下代码[似乎有效:
`[.foo_list` <- function(x, i) {
class(x) <- "list"
as.foo_list(x[i])
}
Run Code Online (Sandbox Code Playgroud)
另一方面,这不会:
`[[<-.foo_list` <- function(x, i, y) {
if (!is.foo(y)) {
stop("Please provide …Run Code Online (Sandbox Code Playgroud) 是否可以使用R的C/C++打印功能覆盖R控制台输出?
Rcpp::sourceCpp( code = '
#include <Rcpp.h>
// [[Rcpp::export]]
void print_test() {
for(int i = 0; i < 10; i++) {
std::stringstream strs;
strs << "number: " << i;
std::string temp_str = strs.str();
char const* char_type = temp_str.c_str();
REprintf(char_type);
}
}'
)
print_test()
Run Code Online (Sandbox Code Playgroud)
这个函数的输出是
number: 0number: 1number: 2number: 3number: 4number: 5number: 6number: 7number: 8number: 9
Run Code Online (Sandbox Code Playgroud)
但我希望它是一个动态的序列.例如:
number: 0
Run Code Online (Sandbox Code Playgroud)
等几秒钟:
number: 1
Run Code Online (Sandbox Code Playgroud)
其中,number: 0完全从控制台删除.重复此过程直到number: 9达到.
我已经看到了这个问题,但是我无法使用回车解决方案来使用REprintf().